今天把这两天抽空简单尝试的爬虫训练做了一下总结,练习的参考书为《从零开始学python网络爬虫》,作者罗攀,蒋仟。本文主要针对书中讲解操作,本人操作过程中,在最新情况下遇到的问题,以及自己的解决方法和未解决问题记录。
(顺便提一句题外话,今天也是清明节,自己能坐在电脑前敲出这段话,要感谢付出的勇士们,感谢他们的伟大,致敬!!!)
一.爬虫三大库:Requests、Lxml、BeautifulSoup
首先安装这三大库,具体操作非常基础,这里不再赘述。
二.User-Agent
个人操作时在这里卡了一会,可能随着chrome版本更新,user-agent位置发生了变化。在目标网页按F12后,找到network,在下列目录中详细查找,这里对于user-agent是否每个网页都固定在同一个目录下不确定,有懂的可以讲讲。
三、get方法请求头
>import requests #载入包
>headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
>res=requests.get('https://zhidao.baidu.com/') #请求网页
>print(res.text)
这里要注意,复制的user-agent需要加上英文引号’’。
为了改进爬虫效率,避免出现错误还要返回重新来一遍,这里有个推荐方法:
>import requests #载入包
>from bs4 import BeautifulSoup #BeautifulSoup解析器中载入包
>headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
>res=requests.get('https://zhidao.baidu.com/',headers=headers)
>soup=BeautifulSoup(res.text,'html.parser')
>try:
print(soup.prettify())
>except ConnectionError:
print('拒绝连接')
BeautifulSoup为python标准库中的HTML解析器。
四、完整示例
这次尝试爬虫为百度知道里面的内容,最开始尝试了书中示例的小猪旅行,不过现在这类网站应该都采取了防爬措施,所以设定的网页会变成淘宝的内容,导致无法爬取,后来尝试了豆瓣电影,也出现了问题,可以爬取整个页面,但是到了某个确定内容就不行了,目前尚未解决。所以建议新手先找个固定网页的网站,先从简单的爬起。
1.对你要爬的网页建立好基本数据,如下代码块前半段,用BeautifulSoup对网页进行解码,可以print一下检验是否成功,这里可以借鉴前面的避免重复作业代码进行改善。
2.具体爬取内容时,在想要爬的位置点击右键,最下方会出现<检查>,点击后会对应该段对应网页代码处,如下图,点击右键检查后,对应优秀答主排名第一的位置的网页代码块。
3.select代码获取方式操作如下,复制后直接粘贴在soup.select(),而想要爬取符合该条件的所有内容时,只需要定位对应元素位置处的网页代码块,把后面多余部分删除。
代码如下:
import requests
from bs4 import BeautifulSoup
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
res=requests.get('https://zhidao.baidu.com/',headers=headers)
soup=BeautifulSoup(res.text,'lxml') #对网页进行解码
#print(res.text)
#该部分为具体爬取内容
authors=soup.select('#body > div.wgt-two-layout > div > div.wgt-two-layout-left > div > div.rank-list > div:nth-child(2)')
#print(type(authors))
#print(authors)
for author in authors:
print(author.get_text()) #这里对该段命令进行重复,保证所有符合的元素都被爬取
结果如下:
<class 'bs4.element.Tag'>
ÓÅÐã´ðÖ÷
1
ºìÉ«ÁÔÈËgexin
30w+»Ø´ð
44w+µãÔÞ
2
ȦGo189
6.4w»Ø´ð
2.9wµãÔÞ
3
½ÔÓпÉÄÜ836
5.1w»Ø´ð
2.5wµãÔÞ
4
Á÷ÐÇÓêÖеÄÒ°º×
2.1w»Ø´ð
8494µãÔÞ
5
DavidÎÚÀÀ
2394»Ø´ð
1061µãÔÞ
五、问题总结
1.动态网页反爬,以及有个别网页能够爬取整个,但是无法对想要的内容专门爬取。
2.user-agent的查找,毕竟网页上自己不够专业,所以属于笨方法慢慢找。
3.结果非常明显是一堆乱码,除了数字可以看出确实爬了对应位置的内容,其他已经看不出想要的汉字内容,初步判断这个错误应该和网页解码有关。
对于这个问题,搜索了一下属于编码问题,也就是网页的采用的编码方式无法直接分析,解决方法很简单,对获取内容进行编码处理,加上下面这段代码就可以了。
res.encoding='GBK'