<一>用urllib库访问URL并采集网络数据
-1. 直接采集
发送请求,打开URL,打印传回的数据(html文件)
- 2. 模拟真实浏览器访问
1)发送http头信息(header)
浏览器在访问网站服务器时,会发送http header头信息。因为有些网站可能会限制爬虫的访问,在写爬虫是如果加上合适的header,伪装成一个浏览器就会更容易访问成功。http header包含很多信息,用浏览器开发者工具可以看到访问网站时浏览器发送给服务器的请求信息(开发者工具——Network——Doc),写爬虫的时候根据需要加上适当的信息即可。
方法如下:
先用Request方法先把url放入一个request对象req中,然后用add_header方法给req加入头信息
语法:req.add_header(key1,value1) req.add_header(key2,value2) #一条语句加入一对信息
从浏览器找到的这些成对的头信息,都可以逐个用以上的方法加入
例如最常用的就是的User-Agent信息,它的作用就是表面浏览器的身份。内容包括浏览器名称,版本,系统信息等等。
add_header方法传入的是一个字典,我们需要把User-Agent 传给key,把查到的User-Agent:后面的内容(各种浏览器访问的身份信息等)传给value。
代码实例:
from urllib import request
req=request.Request("https://en.wikipedia.org")
req.add_header("user-agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36")
response=request.urlopen(req)
print(response.read())
2) 发送data表单数据
发送post请求,需给urlopen()传入两个参数,第一个是包含url地址的(Request方法生成的)请求对象req,第二个是编码后的data表单信息。就是要把需要发送的表单信息通过urlencode()方法编码,生成规定格式的数据传送给Request对象。
这种data表单一般是处理需要动态响应的网页时用的,比如需要用户名和密码登录的,或者需要根据搜索条件查询的(火车票查询等等)
具体方法如下:
可以用http协议调试代理工具(如:fiddler,postman)方便的分析http发送的各种请求数据,这些工具可以模拟向服务器发送请求并取得响应的过程,在写程序之前用它调试一下,就可以知道自己的方法能否访问成功。
要更好的理解这部分内容,需要去系统学习一下htttp表单的知识,目前可以先看一下W3C的HTML表单详解教程:http://www.w3school.com.cn/html/html_forms.asp
小结1:urllib.request模块有两个重要的方法:
urlopen()和Request( )
Request()的参数是一个合法的url地址,返回的是一个Request请求对象
(req),这个对象可以用add_header方法加入头信息。
urlopen()的参数可以直接用url地址,也可以用Request对象,如果在发送 访问请求时需要额外加入一些信息(http
header,data表单之类)就用第二种,urlopen()传回的就是一个类文件对象,可以用read( )方法读取网页的HTML文件
<二>用beautifulsoup库解析采集到的数据