# [Python入门网络爬虫之精华版](https://github.com/lining0806/PythonSpiderNotes)
***
Python学习网络爬虫主要分3个大的版块:**抓取**,**分析**,**存储**
另外,比较常用的爬虫框架[Scrapy](http://scrapy.org/),这里最后也详细介绍一下。
首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:[宁哥的小站-网络爬虫](http://www.lining0806.com/category/spider/)
***
当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入[http://www.lining0806.com/](http://www.lining0806.com/),你就会看到宁哥的小站首页。
简单来说这段过程发生了以下四个步骤:
* 查找域名对应的IP地址。
* 向IP对应的服务器发送请求。
* 服务器响应请求,发回网页内容。
* 浏览器解析网页内容。
网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。
## 抓取
这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。
#### 1. 最基本的抓取
抓取大多数情况属于get请求,即直接从对方服务器上获取数据。
首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,[requests](https://github.com/kennethreitz/requests)也是非常有用的包,与此类似的,还有[httplib2](https://github.com/jcgregorio/httplib2)等等。
```
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
```
此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。
```
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
```
相关参考:[网易新闻排行榜抓取回顾](http://www.lining0806.com/%E7%BD%91%E6%98%93%E6%96%B0%E9%97%BB%E6%8E%92%E8%A1%8C%E6%A6%9C%E6%8A%93%E5%8F%96%E5%9B%9E%E9%A1%BE/)
参考项目:[网络爬虫之最基本的爬虫:爬取网易新闻排行榜](https://github.com/lining0806/PythonSpiderNotes/blob/master/NewsSpider)
### 2. 对于登陆情况的处理
**2.1 使用表单登陆**
这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。
```
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
```
**2.2 使用cookie登陆**
使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。
```
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
```
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:
```
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
```
相关参考:[网络爬虫-验证码登陆](http://www.lining0806.com/6-%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB-%E9%AA%8C%E8%AF%81%E7%A0%81%E7%99%BB%E9%99%86/)
参考项目:[网络爬虫之用户名密码及验证码登陆:爬取知乎网站](https://github.com/lining0806/PythonSpiderNotes/blob/master/ZhihuSpider)
### 3. 对于反爬虫机制的处理
**3.1 使用代理**
适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。
这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。
```
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
```
**3.2 时间设置**
适用情况:限制频率情况。
Requests,Urllib2都可以使用time库的sleep()函数:
```
import time
time.sleep(1)
```
**3.3 伪装成浏览器,或者反“反盗链”**
有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。
```
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
```
### 4. 对于断线重连
不多说。
```
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
```
或者
```
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
```
这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。
### 5. 多进程抓取
这里针对[华尔街见闻](http://live.wallstreetcn.com/ )进行并行抓取的实验对比:[Python多进程抓取](https://github.com/lining0806/PythonSpiderNotes/blob/master/Spider_Python) 与 [Java单线程和多线程抓取](https://github.com/lining0806/PythonSpiderNotes/blob/master/Spider_Java)
相关参考:[关于Python和Java的多进程多线程计算方法对比](http://www.lining0806.com/%E5%85%B3%E4%BA%8Epython%E5%92%8Cjava%E7%9A%84%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95%E5%AF%B9%E6%AF%94/)
### 6. 对于Ajax请求的处理
对于“加载更多”情况,使用Ajax来传输很多数据。
它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。
这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。
* �
没有合适的资源?快使用搜索试试~ 我知道了~
Python入门网络爬虫之精华版
共70个文件
py:17个
png:15个
class:10个
需积分: 5 0 下载量 171 浏览量
2024-02-03
20:43:21
上传
评论
收藏 7.37MB ZIP 举报
温馨提示
互联网上存在着大量值得收集的公共信息,而爬虫技术就是获取这些公共信息的主要工具。本书以主流的Scrapy爬虫框架为例,介绍了Python网络爬虫的组成、爬虫框架的使用以及分布式爬虫等内容。本书运用了大量案例和实践,融入了含金量十足的开发经验,使得内容紧密结合实际应用。在此基础上,本书还通过丰富的练习和操作实践,帮助读者巩固所学的内容。本书配以多元的学习资源和支持服务,包括视频、案例素材、学习社区等,为读者提供全方位的学习体验。 适合作为计算机、大数据等相关专业的教材,也适合具有一定Linux或Python开发基础的人员阅读,还可以作为爬虫工程师的学习用书。 从Python语言的基本特性入手,详细介绍了Python网络爬虫开发的各个方面,涉及HTTP、HTML、JavaScript、正则表达式、自然语言处理、数据科学等不同领域的内容。全书共10章,包括Python基础知识、网站分析、网页解析、Python文件读写、Python与数据库、AJAX技术、模拟登录、文本与数据分析、网站测试、Scrapy爬虫框架、爬虫性能等多个主题。本书可作为高等职业院校计算机类专业的专业课教材,也可供计算
资源推荐
资源详情
资源评论
收起资源包目录
Python入门网络爬虫之精华版.zip (70个子文件)
ahao1111
Spider_Python
WallstreetcnSaveTest.py 6KB
README.md 100B
ZhihuSpider
ZhihuSpider.py 2KB
config.ini 153B
ReadMe.md 481B
NewsSpider
NewsSpider.py 2KB
NewsSpider.exe 5.37MB
ReadMe.md 316B
Captcha1
pic
get_random.jpg 17KB
get_price_img2_binary.png 352B
get_random2.jpg 17KB
get_price_img_binary.png 355B
get_random1_binary.png 684B
get_random1.jpg 17KB
get_random2_binary.png 675B
get_price_img2.png 3KB
get_random_binary_midu_pro1.png 351B
get_price_img1_binary.png 352B
get_price_img.png 3KB
get_random_binary.png 701B
get_random2_binary_midu.png 429B
get_random1_binary_midu_pro1.png 371B
get_random_binary_midu.png 396B
get_random1_binary_midu.png 408B
get_random2_binary_midu_pro1.png 377B
get_price_img1.png 3KB
fnord.tif 1KB
!Test.bat 50B
convert.exe 198KB
pytesser_pro
__init__.py 0B
util.py 669B
pytesser_pro.py 3KB
errors.py 424B
tesseract.exe 1.9MB
ReadMe.md 1KB
tess_test.py 7KB
WechatSearchProjects
Spider_Main.py 775B
Wechatproject
Wechatproject
__init__.py 0B
pipelines.py 4KB
spiders
__init__.py 161B
spider.py 3KB
items.py 335B
settings.py 868B
scrapy.cfg 268B
WechatSearchTest.py 4KB
README.md 326B
Spider_Java
Spider_Java1
lib
mongo-java-driver-2.13.0-rc1.jar 590KB
.classpath 300B
src
wallstreetcnsave
WallstreetcnSaveTest.java 7KB
synchronizetest
Test.java 2KB
bin
wallstreetcnsave
WallstreetcnSaveTest.class 9KB
synchronizetest
Test.class 674B
Booth.class 2KB
Reservoir.class 476B
.project 365B
Spider_Java2
lib
mongo-java-driver-2.13.0-rc1.jar 590KB
.classpath 300B
src
wallstreetcnsave
WallstreetcnSaveTest.java 10KB
synchronizetest
Test.java 2KB
bin
wallstreetcnsave
GetrequestUrl.class 1KB
WallstreetcnSaveTest.class 893B
WallstreetcnSave.class 10KB
synchronizetest
Test.class 674B
Booth.class 2KB
Reservoir.class 476B
.project 382B
README.md 141B
ReadMe.md 12KB
QunarSpider
ReadMe.md 279B
QunarSpider.py 5KB
共 70 条
- 1
资源评论
码农阿豪
- 粉丝: 9938
- 资源: 1750
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功