文章目录
- python爬虫-----网络数据采集
- 一、爬虫基础案例:图片下载器
- 遇到的问题:
- 二、网络数据采集
- 2.网络数据采集之requests库(常用)
- requests方法
- response对象
- 高级应用一: 添加 headers
- 2.fake_useragent:
- 高级应用二: 代理设置
- 报错:
- 项目案例一: 京东商品的爬取
- 项目案例二: 百度/360搜索关键词提交
- 常见问题:
- 小练习
网络爬虫抓取过程可以理解为模拟浏览器操作的过程,所以深入理解 HTTP 协议更有利于爬虫的学习,并且该部分是面试官非常喜欢问的部分,很重要,详情请见:
遇到的问题:
1.问题:[-]下载失败: http://img1.imgtn.bdimg.com/it/u=2384096151,2805439088&fm=214&gp=0.jpg
原因:反斜杠不识别
解决:遍历image_urls时将这里的反斜杠替换成空即可 理解:要把反斜杠替换为
1.网络数据采集之urllib库
2.网络数据采集之requests库(常用)
requests官方网址: https://requests.readthedocs.io/en/master/
requests方法
我们自己写一个服务器来测试,就不会有反爬
request中的 get和post
运行我们的服务器,在运行request代码
response对象
Response对象包含服务器返回的所有信息,也包含请求的Request信息。
高级应用一: 添加 headers
1.有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错。
2.fake_useragent:
UserAgent是识别浏览器的一串字符串,相当于浏览器的身份证,在利用爬虫爬取网站数据时,频繁更换UserAgent可以避免触发相应的反爬机制。对频繁更换UserAgent提供了很好的支持,可谓防反扒利器。
UserAgent实质上是从网络获取所有的用户代理, 再通过random随机选取一个用户代理。
安装:
3.测试
自己写的服务器
启动服务器,运行代码模拟浏览器访问服务器
启动服务器,运行代码模拟浏览器访问服务器
高级应用二: 代理设置
在进行爬虫爬取时,有时候爬虫会被服务器给屏蔽掉,这时采用的方法主要有降低访问时间,通过代理IP访问。ip可以从网上抓取,或者某宝购买。
比较有名的一个免费的IP代理是:西刺IP代理 https://www.xicidaili.com/nn/
测试:
服务器
报错:
1.报错:requests.exceptions.ProxyError: HTTPConnectionPool(host=‘222.95.144.65’, port=3000): Max retries exceeded with url: http://47.92.255.98:8000/ (Caused by ProxyError(‘Cannot connect to proxy.’, NewConnectionError(’<urllib3.connection.HTTPConnection object at 0x000001F379E31B70>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’)))
原因:此IP访问次数超过限制
解决:去西刺IP重新复制新的ip和端口在测试
项目案例一: 京东商品的爬取
运行代码
目录生成一个jd.html文件
用浏览器打开
可以看到是本地的地址:
项目案例二: 百度/360搜索关键词提交
百度的关键词接口:https://www.baidu.com/baidu?wd=xxx&tn=monline_4_dg
360的关键词接口:http://www.so.com/s?q=keyword
1.需求分析,至少要实现两个功能:一是搜索图片,二是自动下载
2.分析网页 http://image.baidu.com/search/index?tn=baiduimage&word=cat (注意:其中可以删除不用的参数,不影响页面的加载) 源代码,配合F12
3.编写正则表达式或者其他解析器代码
4.存储数据到本地
5.正式编写python爬虫代码
页面的分析是十分重要的,不同需求对应不同的URL,不同URL的源码显然是不一样的,所以掌握如何分析页面是成功爬虫的第一步。该页面的源码分析如下图所示:
运行上面代码结果:
常见问题:
(1)为什么只有30张图片,百度出来的不止30张
百度图片是响应式的,不断下拉会不断加载新的图片,也就是说浏览器中的页面是经过JS处理数据后生成的结果,涉及Ajax爬虫内容在此不做详细说明。
(2)在搜索页面下点开的单个图片的 url 与程序中获取的 ObjURL 是不一致的
这可能是百度经过缓存处理的结果,每个图片本质上是“外网的”,非百度的,所以在程序中选择向真正存储图片的 url 发起 HTTP 请求。
小练习
需求分析:通过输入要搜索的关键字,获取页面并将页面保存到本地。
结果展示:输入apologize 后,将获取到的页面存入本地,打开本地的html
代码: