每一个请求,都会有一个Request Headers,我们把它称作请求头。它里面会有一些关于该请求的基本信息,比如:这个请求是从什么设备什么浏览器上发出?这个请求是从哪个页面跳转而来?
如上图,user-agent(中文:用户代理)会记录你电脑的信息和浏览器版本,如果我们想告知服务器,我们不是爬虫,而是一个正常的浏览器。就要去修改user-agent。倘若不修改,那么这里的默认值就会是Python,会被服务器认出来。
origin(中文:源头)和referer(中文:引用来源)则记录了这个请求,最初的起源是来自哪个页面。它们的区别是referer会比origin携带的信息更多些。
对于爬取某些特定信息,也要求你注明请求的来源,即origin或referer的内容。
如何添加Request Headers
import requests
url = 'https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=1&size=10&commentId='
headers = {
'origin':'https://lion-wu.blog.csdn.net',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://lion-wu.blog.csdn.net/article/details/108858689',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
# 标记了请求从什么设备,什么浏览器上发出
}
# 伪装请求头
res = requests.get(url,headers=headers)
1234567891011121314
好极,干!!!
进击吧!小爬虫
这次,我给小爬虫进行了一波易容,可能是它长得不符合服务器的审美吧,所以次次碰壁,这次易容之后,不知道有没有长到服务器的审美上去呢?让我们拭目以待吧!!!
import requests
url = 'https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=1&size=10&commentId='
headers = {
'origin':'https://lion-wu.blog.csdn.net',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://lion-wu.blog.csdn.net/article/details/108858689',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
# 标记了请求从什么设备,什么浏览器上发出
}
# 伪装请求头
res = requests.get(url,headers=headers)
print(res.status_code)
print(res.text)
1234567891011121314151617
bash:129$ python ~/classroom/apps-2-id-5c3d89848939b4000100e7f5/129/main.py
200
{"code":200,"message":"success","data":{"count":60,"pageCount":6,"floorCount":59,"list":[{"info":{"commentId":13646053,"articleId":108858689,"parentId":0,"postTime":"2020-10-30 11:03:45","content":"删除多张表:自己想 O(∩_∩)O~","userName":"qq_43055855","digg":2,"diggArr":[],"parentUserName":null,"parentNickName":null,"avatar":"https://profile.csdnimg.cn/C/B/3/3_qq_43055855","nickName":"海海不掉头发","dateFormat":"6天前","tag":"码皇","parentTag":null,"years":null,"vip":null,"vipIcon":null,"companyBlog":null,"companyBlogIcon":null,"flag":null,"flagIcon":null,"levelIcon":null},"sub":
123
我就截取一点吧,太大了,可以看出来截下来了就好。
别说了,也可以自己去解析一下,这个以我们之前学的解不了。后面我解给你看。
小爬虫被骗啦
当服务器遇上了整容过后的小爬虫,终于“门户大开”,大方的给了一页的数据,一页的数据,一页。。。
但是我要的是全部啊,你就给我一页就想打发我?打发叫花子呢?
那怎么办呢?这个死渣男,小气得很呐,看来又要我们自己动脑筋咯。
带参请求数据
还记得我们最开始是怎么找到评论区的包吗?对,我没说,我是先将页面清空,然后请求访问了第二个页面,这时候就出现了一个新包,用脚指头想都知道那就是第二个页面的包,不过我还是想用第一个页面,于是我就切回去了。
那我们再想想,这些数据我们是在哪里找到的?我不希望看到你们说Preview啊,想清楚啊,想这样说的朋友,给你们一次重新组织语言的机会。
对,明明就是在Headers的General的url里面找到的嘛,Preview怎么爬?对吧。
本来不想多废话,但是我喜欢分析url,所以就多说两句呗。
第一个页面的URL:https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=1&size=10&commentId=
第二个页面的URL:https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=2&size=10&commentId=
第三个页面的URL:https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=3&size=10&commentId=
123
一目了然了吧,不用我再多放了。
import requests
from bs4 import BeautifulSoup
import json
headers = {
'origin':'https://lion-wu.blog.csdn.net',
# 请求来源,本案例中其实是不需要加这个参数的,只是为了演示
'referer':'https://lion-wu.blog.csdn.net/article/details/108858689',
# 请求来源,携带的信息比“origin”更丰富,本案例中其实是不需要加这个参数的,只是为了演示
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
# 标记了请求从什么设备,什么浏览器上发出
}
# 伪装请求头
for i in range(5):
res = requests.get('https://blog.csdn.net/phoenix/web/v1/comment/list/108858689?page=' str(i) '&size=10&commentId=',headers=headers)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
json_items = json.loads(soup.text)
items = json_items['data']['list']
for item in items:
print(item['info']['content'])
print('\n' '----------' '\n')
12345678910111213141516171819202122232425
强行灌输知识点
有时候呢,你会发现你抓取的几个页面不过是在重复(强行灌输知识点)
那就灌一下吧。
我也不知道什么是就要用上,反正先写上。
所以,其实我们可以把Query String Parameters里的内容,直接复制下来,封装为一个字典,传递给params。只是有一点要特别注意:要给他们打引号,让它们变字符串。
所以,代码最后可能长这样:
伪代码
import requests
# 引用requests模块
url = 'https://blog.csdn.net/phoenix/web/v1/comment/list/108858689'
for i in range(5):
'params' = {
'page': str(i)
'size': '10'
'commentId':
}
# 将参数封装为字典
res_comments = requests.get(url,params=params,头)
123456789101112
好极,好极,这篇就到这里啦,爽呐。
下一篇会比较轻松一些,这篇信息量有点大啊。
最后多说一句,想学习Python可联系阿喵,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以关注阿喵,并私信“01”领取。