。。。
一. 基本介绍
什么是爬虫? - 就是抓取网页数据的程序 怎么抓取网页数据 网页三大特征: - 每个网页都有自己的URL (统一资源定位符) 来进行定位 - 网页都是用HTML(超文本标记语言)来描述页面信息 - 网页都使用HTTP/HTTPS(超文本传输协议)来传输HTML数据 爬虫的设计思路: -1. 首先确定需要爬取的网页URL地址 -2. 通过HTTP/HTTPS协议来获取对应的HTML页面 -3. 提取HTML页面里面有用的数据 a. 如果是需要的数据,就保存起来。 b. 如果是页面里的其它URL,那就继续执行第二步。 为什么选择Python做爬虫? - PHP 对多线程 异步支持不够好 并发处理很弱 - Java Python爬虫的最大对手,但是Java语言本身很笨重,代码量很大,重构成本比较高 - C/C++ 运行效率几乎最强,但是学习成本很高,代码成型比较慢 - Python 语言优美,代码简洁,开发效率高,支持的模块多,相关的HTTP请求模块和 还有强大的爬虫Scrapy 以及成熟高效的scrapy-redis分布式策略 而且 调用其他接口也非常方便(胶水语言)
a. 反爬虫 设置多个浏览器
import urllib.request import random user_list = [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1", "Mozilla/5.0 (Windows NT 6.1; rv2.0.1) Gecko/20100101 Firefox/4.0.1", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11" ] # 在User-Agent列表里随机选择一个User-Agent user_agent = random.choice(user_list) # 通过urllib.request.Request() 方法构造一个请求对象 request = urllib.request.Request("http://www.baidu.com/") # add_header()方法 添加/修改 一个HTTP报头 request.add_header("User-Agent", user_agent) # get_header() 获取一个已有的HTTP报头的值,注意只能是第一个字母大写,其他的必须小写 print(request.get_header("User-agent"))
b. 用户输入(url 解码) 百度查找
import urllib.request from urllib import parse url = "http://www.baidu.com/s" headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1"} keyword = input("请输入你要查询的字符串: ") wd = {"wd":keyword} wd = parse.urlencode(wd) # 拼接完整的url fullurl = url + "?" + wd # 构造请求对象 request = urllib.request.Request(fullurl,headers=headers) # 发送请求 response = urllib.request.urlopen(request) print(response.read())
c. Handler处理器 和自定义Opener
import urllib.request from urllib import parse # 构建一个HTTPHandler处理器对象,支持处理HTTP的请求 http_hander = urllib.request.HTTPHandler() # 调用build_opener() 方法构建一个自定义的opener对象, 参数是构建的处理器对象 opener = urllib.request.build_opener(http_hander) request = urllib.request.Request("http://www.baidu.com") response = opener.open(request) print(response.read())