Python爬虫入门(1)————一些容易忽视的注意事项

关键词:爬虫

这一节,我们讨论一下爬虫的一些注意事项

  • 如何正确的对网页进行转码:
1
2
3
4
5
6
7
8
import requests
path = 'https://www.****.com/htm/****.htm'
headers = {
'accept-language':'zh-CN,zh;q=0.8,en;q=0.6'
}
response = requests.get(path,headers = headers)
response.encoding='utf-8'
print(response.text)

例子如上:对requests之后的response使用response.encoding='utf-8',然后再使用.text即可


一个好的爬虫专栏:

https://zhuanlan.zhihu.com/pachong

一译

JSONview插件chrome浏览器


  • 如何查看网页是由 js 加载还是直接加载的:

我们使用 chrome 浏览器,点击域名栏左侧的安全或者是叹号,在里面将 javascript 选项选择阻止,如果重新加载之后网页没有变化,就说明不是使用 js 加载的,如果加载不出来,说明使用 js 加载的。


  • 关于爬虫协议 robots.txt

一般在站点的根目录下都会放置一个爬虫协议如:

http://www.baidu.com/robots.txt

里面的内容形式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> 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?
>
> ....
> ....
>

>

解释下

1
2
3
4
> #表示禁止所有搜索引擎访问网站的所有部分
> User-agent: *
> Disallow: /
>

>

1
2
3
4
5
6
> #禁止所有搜索引擎,访问站点的一下几个目录的内容,其他目录的内容可以访问
> User-agent: *
> Disallow: /01/
> Disallow: /02/
> Disallow: /03/
>

>

1
2
3
4
5
6
7
> #特定引擎 BadBot, 不允许访问的内容是所有内容
> User-agent: BadBot
> Disallow: /
> #特定引擎 BadHot, 不允许访问的内容是站点 subject 目录下的内容
> User-agent: BadHot
> Disallow: /subject/
>

>

1
2
3
4
5
6
> 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 和响应头

在反爬虫做的很好的网站,必须加入好多请求头信息,爬虫才会默认我们是人类,而不是机器人

请求头:

1
2
3
4
5
6
7
8
9
10
11
12
> 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(请求网站的时间)
>

>

响应头:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> 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有好多不同之处

1
2
3
4
5
6
7
8
9
10
11
> 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=
>

>

我把其中特别的几项(爬虫用于验证身份的几项列出来)

1
2
3
4
5
6
7
> ------一个是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 字典里

  • 大规模爬取与小规模的差很多