关键词:爬虫
这一节,我们讨论一下爬虫的一些注意事项
- 如何正确的对网页进行转码:
|
|
例子如上:对requests之后的response使用response.encoding='utf-8'
,然后再使用.text
即可
一个好的爬虫专栏:
https://zhuanlan.zhihu.com/pachong
一译
JSONview插件chrome浏览器
我们使用 chrome 浏览器,点击域名栏左侧的安全或者是叹号,在里面将 javascript 选项选择阻止,如果重新加载之后网页没有变化,就说明不是使用 js 加载的,如果加载不出来,说明使用 js 加载的。
一般在站点的根目录下都会放置一个爬虫协议如:
http://www.baidu.com/robots.txt
里面的内容形式如下
123456789101112131415161718 > User-agent: Baiduspider> Disallow: /baidu> Disallow: /s?> Disallow: /ulink?> Disallow: /link?>> User-agent: Googlebot> Disallow: /baidu> Disallow: /s?> Disallow: /shifen/> Disallow: /homepage/> Disallow: /cpro> Disallow: /ulink?> Disallow: /link?>> ....> ....>
>
解释下
1234 > #表示禁止所有搜索引擎访问网站的所有部分> User-agent: *> Disallow: />
>
123456 > #禁止所有搜索引擎,访问站点的一下几个目录的内容,其他目录的内容可以访问> User-agent: *> Disallow: /01/> Disallow: /02/> Disallow: /03/>
>
1234567 > #特定引擎 BadBot, 不允许访问的内容是所有内容> User-agent: BadBot> Disallow: /> #特定引擎 BadHot, 不允许访问的内容是站点 subject 目录下的内容> User-agent: BadHot> Disallow: /subject/>
>
123456 > Allow: /cgi-bin/ 这里定义是允许爬寻cgi-bin目录下面的目录> Allow: /tmp 这里定义是允许爬寻tmp的整个目录> Allow: .htm$ 仅允许访问以".htm"为后缀的URL。> Allow: .gif$ 允许抓取网页和gif格式图片> Sitemap: 网站地图 告诉爬虫这个页面是网站地图>
- 关于使用 xpath
xpath 是 lxml 的一个获取HTML的一个东西,可以直接在检查中获取,因为 lxml 由 C 编写,所以速度要比BeautifulSoup快
- 关于 AJAX 加载的页面
有些网页,我们翻页之后,页面的URL不会发生改变,检查不是因为 js 加载的情况之后,一般在谷歌浏览器中右键检查然后选择network里面的all,这个时候我们换一下页码,然后看看里面的preview,就可以看出来了。
总结:一般,翻页之后,URL没有发生变化的一般为AJAX加载,我们要从XHR或者JS里面去寻找爬取的线索,一般要把所有的请求清空,然后点击下一页。
- JSONview插件chrome浏览器
可以在chrome 浏览器中使用这个插件,在异步加载 AJAX 过程中,我们就可以在开发者工具中,使用这个插件将 JSON 进行格式化输出
- 请求头headers 和响应头
在反爬虫做的很好的网站,必须加入好多请求头信息,爬虫才会默认我们是人类,而不是机器人
请求头:
123456789101112 > Accept: text/html,image/*(浏览器可以接收的类型)> Accept-Charset: ISO-8859-1(浏览器可以接收的编码类型)> Accept-Encoding: gzip,compress(浏览器可以接收压缩编码类型)> Accept-Language: en-us,zh-cn(浏览器可以接收的语言和国家类型)> Host: www.it315.org:80(浏览器请求的主机和端口)> If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(某个页面缓存时间)> Referer: http://www.it315.org/index.jsp(请求来自于哪个页面)> User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(浏览器相关信息)> Cookie:(浏览器暂存服务器发送的信息)> Connection: close(1.0)/Keep-Alive(1.1)(HTTP请求的版本的特点)> Date: Tue, 11 Jul 2000 18:23:51 GMT(请求网站的时间)>
>
响应头:
1234567891011121314151617 > Location: http://www.it315.org/index.jsp(控制浏览器显示哪个页面)> Server:apache tomcat(服务器的类型)> Content-Encoding: gzip(服务器发送的压缩编码方式)> Content-Length: 80(服务器发送显示的字节码长度)> Content-Language: zh-cn(服务器发送内容的语言和国家名)> Content-Type: image/jpeg; charset=UTF-8(服务器发送内容的类型和编码类型)> Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服务器最后一次修改的时间)> Refresh: 1;url=http://www.it315.org(控制浏览器1秒钟后转发URL所指向的页面)> Content-Disposition: attachment; filename=aaa.jpg(服务器控制浏览器发下载方式打开文件)> Transfer-Encoding: chunked(服务器分块传递数据到客户端)> Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服务器发送Cookie相关的信息)> Expires: -1(服务器控制浏览器不要缓存网页,默认是缓存)> Cache-Control: no-cache(服务器控制浏览器不要缓存网页)> Pragma: no-cache(服务器控制浏览器不要缓存网页)> Connection: close/Keep-Alive(HTTP请求的版本的特点)> Date: Tue, 11 Jul 2000 18:23:51 GMT(响应网站的时间)>
- 特殊的请求头和响应头信息——以知乎为例
知乎你登录后,浏览信息,他的request-header有好多不同之处
1234567891011 > accept:application/json, text/plain, */*> Accept-Encoding:gzip, deflate, br> Accept-Language:zh-CN,zh;q=0.8,en;q=0.6> authorization:Bearer Mi4xQ01rZEFBQUFBQUFBVUlKWkE0aTVDeGNBQUFCaEFsVk5tY0RXV2dEMXZGbTZpbGJzX2tma0Itamh2RWhWdVdPQzhR|1508471449|a86d19990d47a31f3a9e9024bb1d1a15e8f9a53e> Connection:keep-alive> Cookie:_zap=5e5da3cd-545c-4642-8392-534f021f53b1; d_c0="AFCCWQOIuQuPTlmLLuby8TEFDROSBhQJEio=|1494209355"; r_cap_id="ODg2OWQ5MGIyMjdkNDkwMDgzNzY1OTE5ZWYzODBhMDE=|1508471442|9a0726321ff2ff543d47c12b9554f6eb4dcff47d"; cap_id="NzEzNGQ3NTVhYjdiNGY5MGEzNzcxZTE0OWY5Nzk2YTM=|1508471442|bf83c58212c39c654e693236611272f7d007cc73"; z_c0=Mi4xQ01rZEFBQUFBQUFBVUlKWkE0aTVDeGNBQUFCaEFsVk5tY0RXV2dEMXZGbTZpbGJzX2tma0Itamh2RWhWdVdPQzhR|1508471449|a86d19990d47a31f3a9e9024bb1d1a15e8f9a53e; aliyungf_tc=AQAAAIkOH0C3Wg0AgqjCOpKX0GRc+8ag; q_c1=7a8336678f744f338ba84397145d8ce1|1508746676000|1492264806000; q_c1=7a8336678f744f338ba84397145d8ce1|1508746676000|1492264806000; s-q=vczh; s-i=1; sid=leqk4kg8; __utma=51854390.948185062.1508471444.1509788776.1510206822.6; __utmc=51854390; __utmz=51854390.1510206822.6.4.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmv=51854390.100-1|2=registration_date=20131026=1^3=entry_date=20131026=1; _xsrf=b842ca7b-0d11-4637-80a0-1260104f0d8b> Host:www.zhihu.com> Referer:https://www.zhihu.com/people/excited-vczh/following?page=2> User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36> X-UDID:AFCCWQOIuQuPTlmLLuby8TEFDROSBhQJEio=>
>
我把其中特别的几项(爬虫用于验证身份的几项列出来)
1234567 > ------一个是authorization> authorization:Bearer Mi4xQ01rZEFBQUFBQUFBVUlKWkE0aTVDeGNBQUFCaEFsVk5tY0RXV2dEMXZGbTZpbGJzX2tma0Itamh2RWhWdVdPQzhR|1508471449|a86d19990d47a31f3a9e9024bb1d1a15e8f9a53e> ------一个是User-Agent> User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36> ------一个是X-UDID> X-UDID:AFCCWQOIuQuPTlmLLuby8TEFDROSBhQJEio=>
>
我们在爬虫的时候,需要将他们以字典的形式放在 header 字典里
- 大规模爬取与小规模的差很多