Python爬取句子迷-莎士比亚语录,,爬取句子迷——莎士比
Python爬取句子迷-莎士比亚语录,,爬取句子迷——莎士比
爬取句子迷——莎士比亚语录(约2290个句子,229个分页)
这个练手的过程,在我不使用IP代理的情况下,我使用的IP惨遭封禁数次,好在隔几个小时就会被解封,但我却好比黏人的鼻涕虫一般,句子不给我,我就不走了,哼哼。
工具使用的是 Python3.7 + requests + BeautifulSoup4 + 线程
首先句子迷是具有一定反爬程序的,具体是怎样的就不清楚,但是文字还是整整齐齐摆放着,这个还是很友好的,前端页面分析完就开始我数次爬取尝试。
第一次尝试爬取数据
规规矩矩的在边缘试探,结果很不理想,字都存放在TXT文件中(171KB),根本爬不完就被封IP了,返回给你一个403的状态码,很过分的哦,就几个字也这么小气不给我,还反爬,既然被封了,我就只能睡觉了呗!
第二、三次尝试
我一早起来,发现句子迷这个网站又能访问了,开心的很呐,还以为被封了就不能再访问了呢,然后就开始了我第二次尝试,这次我想着不能这么明目张胆了,得猥琐一点的,用时间换取完整且成功的结果。
当然这个方法就是利用sleep进行伪装咯,因为一共229页,我设置每爬取5页就随机休息5以内秒哦,time.sleep(random.randint(1,5)) ,这样我不过分吧!可是呢,结果又让我失望了一波,IP再一次被封,当然我也不会放弃,解封之时就是我再战之时,当然这样设置一下还是有收获的,爬取到相当于上一次两倍的数据量。第三次尝试,我为了避免休眠数字随机性被检测到,我专门设置了小数加在后面,然而并没有什么用。
第四次尝试
永不言弃的我在第四次不好意思的是又失败了,但这一次我完全放下了身段,因为这次我打算睡眠1-5秒的同时只爬取一页的数据,这个不过分吧,跟人手动点击的速度差不多了吧,想着多花点时间赶紧了结了吧。谁知我才离开电脑不久IP就被封了,得到的句子比起之前的反而更少了,而且封的同时 我发现请求这个页面被封前我都休息了5秒,这就让我怀疑 并不是访问频率过快,而是访问周期过长? 然后我赶紧修改程序,开启了我第三次尝试,因为宽带IP被封了,迫于需要更换IP,这接下来的尝试则是使用的手机热点...0.0,原本都没想着能成功的。
第五次尝试
这一次我想使用的是线程,通过html代码中pager-lastclass下的a标签获取总页数,然后创建对应数量的线程,同时爬取每一页的句子并存储在 对应页数.txt 文件中,每个txt文件相当于10个句子。这一次我终于成功拿到我想要的所有数据,还蛮兴奋咯,差点逼得我要使用代理了。
部分代码如下
#coding=utf-8import requestsfrom requests import codesimport ioimport bs4import osimport randomimport timeimport threadingfrom bs4 import BeautifulSoupwebUrl = ‘https://www.juzimi.com/‘headers = {‘user-agent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36‘}def downLoadPageExtra(url): try: realUrl = webUrl + ‘/writer/%E8%8E%8E%E5%A3%AB%E6%AF%94%E4%BA%9A‘+"?page="+str(url) content = requests.get(realUrl,headers = headers) content.encoding = "UTF-8" if codes.ok == content.status_code: soup = BeautifulSoup(content.text,‘html.parser‘) downLoadTxt = soup.findAll(‘a‘,class_=‘xlistju‘) f = open("juzimi"+ "/" + str(url) + ".txt", ‘a‘, encoding=‘utf-8‘) for dlt in downLoadTxt: f.writelines((dlt.text)+"\r\n\r\n") print(str(url)+"OK") f.close() else: print("状态码出错") except: print("getPageCodeError1")def downLoadPage(url): try: content = requests.get(url,headers = headers) content.encoding = "UTF-8" if codes.ok == content.status_code: soup = BeautifulSoup(content.text,‘html.parser‘) downLoadTxt = soup.findAll(‘a‘,class_=‘xlistju‘) #获取标题创建文件 title = str(soup.title.string).strip(‘/‘).split(‘?‘)[0] #获取页数 pageCounts = soup.find(‘li‘,class_=‘pager-last‘).find_all(‘a‘)[0].text f=open("juzimi"+"/"+ title + ".txt", ‘a‘,encoding=‘utf-8‘) for dlt in downLoadTxt: f.writelines(str(dlt.text)+"\r\n\r\n") f.close() print("第一句完成") for num in range(1,int(pageCounts)): t = threading.Thread(target=downLoadPageExtra,args=(num,)) t.start() print(‘爬取完成...‘) except requests.ConnectionError: print("getPageCodeError2")if __name__ == ‘__main__‘: dirSave = ‘juzimi/‘ if os.path.exists(dirSave) is False: os.makedirs(dirSave) downLoadPage(webUrl + ‘/writer/%E8%8E%8E%E5%A3%AB%E6%AF%94%E4%BA%9A‘)
代码具体如上,不保证百分百直接能运行,因为是从项目中复制过来并且做了部分修改,但是大致原理已说明,使用多线程,因为是IO密集型,所以多线程还是挺好使的,速度那是相当的快啊,几十秒就通通搞定,当然我们如果需要将所有txt文件合并成一个的话,我又写了一个合并程序。
代码如下
import io# 通过html页面标题命名的txt文件,并且存储的第一页的句子mergeTxtName = ‘莎士比亚经典语录_名言_名句赏析_句子迷.txt‘# 开始标记start = 1# 结束标记end = 228f = open(mergeTxtName,‘a‘,encoding=‘utf-8‘)for n in range(start,end + 1): g = open(str(n)+‘.txt‘,‘r‘,encoding=‘utf-8‘) f.write(g.read()) print(str(n)+"完成") g.close()f.close()print("ok")
此代码文件应当放置在下载目录中,否则请修改对应路径,若并不是获取莎士比亚的句子,还需要修改mergeTxtName字符串,此代码不提供删除已合并的txt文件,若需要可自行增加...自写程序时请注意文件读写操作时的字体编码问题...
总结
写爬虫当多多练手,基础的熟练,再有针对的提高难度,征服更多网站,第一次尝试使用博客园的markdown风格,相比较有道云笔记本的书写,这里不是很习惯,先试着一次,个人感觉效果好的话以后就用这种方式写了,要是有一个实时预览该有多好啊。
爬取了莎士比亚的句子后并不是满足于技术的提升,说到底并没有多少提升,总归的来说还是属于静态界面,初心则是想阅览一下这些有趣的句子,有一些话语写的真的很好,并成为我的座右铭:
我荒废了时间,时间便把我荒废了。
Python爬取句子迷-莎士比亚语录
相关内容
- python 3.5.2 install pillow,,1. 首先尝试从官网
- python模块之os_sys_动态导入_包,,#!/usr/bin
- [python学习篇][廖雪峰][1]高级特性--创建生成器 方法1
- python 实现下标循环,,Python内置的e
- 用Python将绝对URL替换成相对URL的代码,,下面的内容内容
- [python基础] csv.wirterow()报错UnicodeEncodeError,,python在安装
- python学习笔记——线程threading,,1 线程thread
- Python中办公软件(创建excel),,from colle
- 反转整数(Python实现)很容易懂的那种,,题目:给出一
- python—函数,,# 函数:1、减少重
评论关闭