知乎搜索爬虫
https://www.zhihu.com/search?type=content&q=爬虫
百度搜索python
https://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xfa23c74400149f2c&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=7&rsv_sug1=5&rsv_sug7=100&rsv_sug2=0&inputT=716&rsv_sug4=1516
由上可知,每个url都是由两部分组成:[https://xxx.xxx.xx/xx/xx] 和 [xx=xx&xx=x]
中间用 ‘?’ 连接
前半部分是我们要访问的网页地址,后半部分就是请求的参数
参数的结构:
参数的结构和字典很像,有键有值,键=值;每组键值字间用&来连接
带参访问:url+str()
例如:url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start='+str(i*20)
你可以改变后面i的值再访问链接
https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20
传递url参数,通常一个字符串会跟在url后面中间以?分开
这样看上去比较繁琐啰嗦,不够简洁,resquests模块里面requests.get()中有一个参数parms,它可以让我们用字典的形式,把参数传进去,
例如:
url_test=httpbin.org/get?key=va1
payload={"key1":"value1","key3"=["value3","value4"]}
res=requests.get(url_test,parms=payload)
print(res.url) #http://httpbin.org/get?key1=value1&key3=value3&key3=value4
其实我们打开每一个请求,都会有一个Requests Headers,一般我们称之为“请求头”。它里面会有一些关于该请求的基本信息,例如它会记录发出请求的设备和浏览器。图中的user-agent(既用户代理)记录的就是我的电脑系统信息(win10系统)和浏览器(谷歌浏览器)。
origin和referer则是记录了这个请求的最初来源是哪个页面。相比之下referer会比origin更长,这意味着referer会携带更多的信息。
谷歌爬虫的user-agent是Googlebot;
而百度的是Baiduspider。
如何封装requests headers:
与封装params非常类似,我们只需要将origin或referer一并作为字典写入headers就好
例如:
headers = {
'origin':'https://y.qq.com',
# 请求来源
'referer':'https://y.qq.com/n/yqq/song/004Z8Ihr0JIu5s.html',
# 请求来源
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
# 标记了请求从什么设备,什么浏览器上发出
}
如果你的循环次数非常多,服务器很可能拒绝爬虫访问。因为即使是可以爬的网站,过于频繁的访问也可能被判定为对网站的攻击。这种情况下你最好将自己的爬虫伪装成真实的浏览器(也就是在请求时填写请求头)。对于不允许爬虫访问的网站如知乎、猫眼电影等更应该如此。