主要讲解爬虫相关的知识如:http、网页、爬虫法律等,让大家对爬虫有了一个比较完善的了解和一些题外的知识点。
今天这篇文章,我们从今天开始就正式进入实战阶段,后面将会有更多的实际案例。
为大家讲解了HTTP原理,很多人好奇:好好的讲爬虫和HTTP有什么关系?其实我们常说的爬虫(也叫网络爬虫)就是使用一些网络协议发起的网络请求,而目前使用最多的网络协议便是HTTP/S网络协议簇。
在真实浏览网页我们是通过鼠标点击网页然后由浏览器帮我们发起网络请求,那在Python中我们又如何发起网络请求的呢?答案当然是库,具体哪些库?猪哥给大家列一下:
Python网络请求库有点多,而且还看见网上还都有用过的,那他们之间有何关系?又该如何选择?
综上所述,我们选择选择requests库作为我们爬虫入门的起点。另外以上的这些库都是同步网络库,如果需要高并发请求的话可以使用异步网络库:aiohttp,这个后面猪哥也会为大家讲解。
**希望大家永远记住:学任何一门语言,都不要忘记去看看官方文档。**也许官方文档不是最好的入门教程,但绝对是最新、最全的教学文档!
requests的官方文档(目前已支持中文)
从首页中让HTTP服务人类这几个字中我们便能看出,requests核心宗旨便是让用户使用方便,间接表达了他们设计优雅的理念。
注:PEP 20便是鼎鼎大名的Python之禅。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
都说requests功能强大,那我们来看看requests到底有哪些功能特性吧:
requests 完全满足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行
pip install requests
如果是pip3则使用
pip3 install requests
如果你使用anaconda则可以
conda install requests
如果你不想用命令行,可在pycharm中这样下载库
下图是猪哥之前工作总结的一个项目开发流程,算是比较详细,在开发一个大型的项目真的需要这么详细,不然项目上线出故障或者修改需求都无法做项目复盘,到时候程序员就有可能背锅祭天。。。
言归正传,给大家看项目的开发流程是想引出爬虫爬取数据的流程:
起点中文网创建于2002年5月,是国内最大文学阅读与写作平台之一,是国内领先的原创文学门户网站,隶属于国内最大的数字内容综合平台——阅文集团旗下。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架尉♥信(同音):2763177065 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
总体思路分为三步:
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()
成功!
生成的文件夹如下图: