主要讲解爬虫相关的知识如:http、网页、爬虫法律等,让大家对爬虫有了一个比较完善的了解和一些题外的知识点。
今天这篇文章,我们从今天开始就正式进入实战阶段,后面将会有更多的实际案例。
为大家讲解了HTTP原理,很多人好奇:好好的讲爬虫和HTTP有什么关系?其实我们常说的爬虫(也叫网络爬虫)就是使用一些网络协议发起的网络请求,而目前使用最多的网络协议便是HTTP/S网络协议簇。
一、Python有哪些网络库
在真实浏览网页我们是通过鼠标点击网页然后由浏览器帮我们发起网络请求,那在Python中我们又如何发起网络请求的呢?答案当然是库,具体哪些库?猪哥给大家列一下:
Python2: httplib、httplib2、urllib、urllib2、urllib3、requests
Python3: httplib2、urllib、urllib3、requests
Python网络请求库有点多,而且还看见网上还都有用过的,那他们之间有何关系?又该如何选择?
httplib/2:这是一个Python内置http库,但是它是偏于底层的库,一般不直接用。而httplib2是一个基于httplib的第三方库,比httplib实现更完整,支持缓存、压缩等功能。一般这两个库都用不到,如果需要自己 封装网络请求可能会需要用到。
urllib/urllib2/urllib3:urlliib是一个基于httplib的上层库,而urllib2和urllib3都是第三方库,urllib2相对于urllib增加一些高级功能,如:HTTP身份验证或Cookie等,在Python3中将urllib2合并到了urllib中。urllib3提供线程安全连接池和文件post等支持,与urllib及urllib2的关系不大。
requests:requests库是一个基于urllib/3的第三方网络库,它的特点是功能强大,API优雅。由上图我们可以看到,对于http客户端python官方文档也推荐我们使用requests库,实际工作中requests库也是使用的比较多的库。
综上所述,我们选择选择requests库作为我们爬虫入门的起点。另外以上的这些库都是同步网络库,如果需要高并发请求的话可以使用异步网络库:aiohttp,这个后面猪哥也会为大家讲解。
二、requests介绍
希望大家永远记住:学任何一门语言,都不要忘记去看看官方文档。也许官方文档不是最好的入门教程,但绝对是最新、最全的教学文档!
1.首页
requests的官方文档(目前已支持中文)
从首页中让HTTP服务人类这几个字中我们便能看出,requests核心宗旨便是让用户使用方便,间接表达了他们设计优雅的理念。
注:PEP 20便是鼎鼎大名的Python之禅。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
2.功能特性
都说requests功能强大,那我们来看看requests到底有哪些功能特性吧:
Keep-Alive & 连接池
国际化域名和 URL
带持久 Cookie 的会话
浏览器式的 SSL 认证
自动内容解码
基本/摘要式的身份认证
优雅的 key/value Cookie
自动解压
Unicode 响应体
HTTP(S) 代理支持
文件分块上传
流下载
连接超时
分块请求
支持 .netrc
requests 完全满足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行
三、安装requests
pip install requests
如果是pip3则使用
pip3 install requests
如果你使用anaconda则可以
conda install requests
如果你不想用命令行,可在pycharm中这样下载库
四、爬虫流程
下图是猪哥之前工作总结的一个项目开发流程,算是比较详细,在开发一个大型的项目真的需要这么详细,不然项目上线出故障或者修改需求都无法做项目复盘,到时候程序员就有可能背锅祭天。。。
言归正传,给大家看项目的开发流程是想引出爬虫爬取数据的流程:
确定需要爬取的网页
寻找加载数据url的参数规律(如分页)
代码模拟请求爬取数据
总体思路分为三步:
1.分析网页结构,利用xpath表达式爬取到所有的文章名字与链接,并按文章名字生成文件夹。
import requestsfrom urllib import requestfrom lxml import etreeimport osheader = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}class Spider(object): def start_request(self): url = 'https://www.qidian.com/all' req = request.Request(url,headers=header) html= request.urlopen(req).read().decode('utf-8') html=etree.HTML(html) bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()') ##爬取所有的文章名字 bigsrc_list = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') print(bigtit_list) print(bigsrc_list) for bigtit,bigsrc in zip(bigtit_list,bigsrc_list): if os.path.exists(bigtit)==False: os.mkdir(bigtit) self.file_data(bigsrc,bigtit)
2.利用文章链接,爬取每个章节名字与链接
def file_data(self,bigsrc,bigtit): #详情页 url="http:"+bigsrc req = request.Request(url, headers=header) html = request.urlopen(req).read().decode('utf-8') html = etree.HTML(html) print(html) Lit_tit_list = html.xpath('//ul[@class="cf"]/li/a/text()') #爬取每个章节名字 Lit_href_list = html.xpath('//ul[@class="cf"]/li/a/@href') #每个章节链接 for tit,src in zip(Lit_tit_list,Lit_href_list): self.finally_file(tit,src,bigtit)
3.利用每个章节的链接,生成带有章节名称的txt文件,并保存到每个文章文件夹下。
def finally_file(self,tit,src,bigtit): url = "http:" + src req = request.Request(url, headers=header) html = request.urlopen(req).read().decode('utf-8') html = etree.HTML(html) text_list = html.xpath('//div[@class="read-content j_readContent"]/p/text()') text = "\n".join(text_list) file_name = bigtit + "\\" + tit + ".txt" print("正在抓取文章:" + file_name) with open(file_name, 'a', encoding="utf-8") as f: f.write(text)spider=Spider()spider.start_request()
成功!
生成的文件夹如下图:
用户评论
哇!这也太厉害了吧!居然能用 Python 直接采集起点中文网的所有数据!
有5位网友表示赞同!
我想知道他采集到的数据有哪些?小说内容吗?作者信息吗?评分吗?
有5位网友表示赞同!
如果能把这些数据进行分析,肯定会有很多有趣的发现。比如最热门的类型、作者风格等等。
有19位网友表示赞同!
这个 Python 代码共享了吗?好想看看怎么写这种爬虫!
有19位网友表示赞同!
起点中文网越来越火爆是真的!我现在看小说基本都是去那里了。
有7位网友表示赞同!
数据采集真是太棒了!希望他能够继续分享更多他的成果。
有20位网友表示赞同!
这篇文章的标题好吸引人,我忍不住点进来一看!
有15位网友表示赞同!
我之前想过要自己爬取起点数据的,但感觉难度太大了,还是佩服这个作者。
有17位网友表示赞同!
如果能把数据做成可视化图表,效果一定很棒!
有16位网友表示赞同!
我想知道他采集这些数据用了多久?这么大的网站肯定需要很长时间吧?
有18位网友表示赞同!
这种技术可以用在很多方面,可以帮我们分析网络信息、发现趋势等等。
有12位网友表示赞同!
Python 真是太强大了吧!现在这么多用途的编程语言都用 Python 来做。
有9位网友表示赞同!
希望他以后还能开发出一些有意思的工具软件,比如自动生成小说梗概或者推荐你喜欢的类型的小说。
有10位网友表示赞同!
这个作者的博客好棒啊!我一直关注他的作品。
有17位网友表示赞同!
我觉得起点中文网的分类系统也很好,可以根据不同的类型、喜好轻松找到想看的作品。
有9位网友表示赞同!
我以前喜欢看武侠小说,现在越来越喜欢都市言情了。
有6位网友表示赞同!
数据的价值很大,希望他能够用数据来帮助更多人发现精彩的作品。
有20位网友表示赞同!
期待看到他未来带来的更精彩的项目!
有8位网友表示赞同!
起点中文网上有很多好作者,他们的作品充满了想象力和创造力。
有17位网友表示赞同!