Python入门网络爬虫之精华版

Python入门网络爬虫之精华版

Python学习网络爬虫主要分3个大的版块:抓取分析存储

另外,比较常用的爬虫框架Scrapy,这里最后也介绍一下。

先列举一下相关参考:宁哥的小站-网络爬虫


抓取

这一步,你要明确要得到的内容是是什么?是HTML源码,还是Json格式的字符串等等。

1. 最基本的抓取

一般属于get请求情况,直接从服务器上获取数据。

首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。

Requests:
    import requests
    response = requests.get(url)
    content = requests.get(url).content # string
    print "response headers:", response.headers # dict
    print "content:", content
Urllib2:
    import urllib2
    response = urllib2.urlopen(url)
    content = urllib2.urlopen(url).read() # string
    print "response headers:", response.headers # not dict
    print "content:", content
Httplib2:
    import httplib2
    http = httplib2.Http()
    response_headers, content = http.request(url, ‘GET‘)
    print "response headers:", response_headers # dict
    print "content:", content

此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。

data = {‘data1‘:‘XXXXX‘, ‘data2‘:‘XXXXX‘} # dict类型
Requests:data为dict,json
    import requests
    response = requests.get(url=url, params=data) # GET请求发送
Urllib2:data为string
    import urllib, urllib2
    data = urllib.urlencode(data) # 编码工作,由dict转为string
    full_url = url+‘?‘+data # GET请求发送
    response = urllib2.urlopen(full_url)

2. 对于反爬虫机制的处理

2.1 模拟登陆情况

这种属于post请求情况,先向服务器发送表单数据,服务器再将返回的cookie存入本地。

data = {‘data1‘:‘XXXXX‘, ‘data2‘:‘XXXXX‘} # dict类型
Requests:data为dict,json
    import requests
    response = requests.post(url=url, data=data) # POST请求发送,可用于用户名密码登陆情况
Urllib2:data为string
    import urllib, urllib2
    data = urllib.urlencode(data) # 编码工作,由dict转为string
    req = urllib2.Request(url=url, data=data) # POST请求发送,可用于用户名密码登陆情况
    response = urllib2.urlopen(req)

2.2 使用cookie登陆情况

使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。

import requests
requests_session = requests.session() # 创建会话对象requests.session(),可以记录cookie
response = requests_session.post(url=url_login, data=data) # requests_session的POST请求发送,可用于用户名密码登陆情况。必须要有这一步!拿到Response Cookie!

若存在验证码,此时采用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!

相关参考:网络爬虫-验证码登陆

参考项目:爬取知乎网站

2.3 伪装成浏览器,或者反“反盗链”

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)

3. 使用代理

适用情况:限制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)

4. 对于断线重连

def multi_session(session, *arg):
    while True:
        retryTimes = 20
    while retryTimes>0:
        try:
            return session.post(*arg)
        except:
            print ‘.‘,
            retryTimes -= 1

或者

def multi_open(opener, *arg):
    while True:
        retryTimes = 20
    while retryTimes>0:
        try:
            return opener.open(*arg)
        except:
            print ‘.‘,
            retryTimes -= 1

这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。

5. 多进程抓取

这里针对华尔街见闻进行多进程的实验对比:Python多进程抓取Java多进程抓取

相关参考:关于Python和Java的多进程多线程计算方法对比

6. 对于Ajax请求的处理

对于“加载更多”情况,使用Ajax来传输很多数据。它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。

这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。

* 如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。

* 对返回的json格式数据(str)进行正则匹配。json格式数据中,需从’\uxxxx’形式的unicode_escape编码转换成u’\uxxxx’的unicode编码。

参考项目:Python多进程抓取

7. 验证码识别

对于网站有验证码的情况,我们有三种办法:

  1. 使用代理,更新IP。
  2. 使用cookie登陆。
  3. 验证码识别。

使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。

可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。如果不成功,可以再次更新验证码识别,直到成功为止。

参考项目:Captcha1

分析

抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。

常见的分析工具有正则表达式BeautifulSouplxml等等。

存储

分析出我们需要的内容之后,接下来就是存储了。

我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。

Scrapy

Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。

相关内容可以参考基于Scrapy网络爬虫的搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 13:19:04

Python入门网络爬虫之精华版的相关文章

Python 入门网络爬虫之精华版

转载 宁哥的小站,总结的不错 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下. 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫 当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入http://www.lining0806.com/,你就会看到宁哥的小站首页. 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址. 向IP对应的服务器发送请求. 服务

Python 爬虫入门之爬取妹子图

Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob/master/%E7%88%AC%E8%99%AB%E9%9B%86%E5%90%88/meizitu.py 爬虫成果 当你运行代码后,文件夹就会越来越多,如果爬完的话会有2

Python入门篇(一)

一.Python入门 python学习博客:http://www.cnblogs.com/haiyan123/p/8387770.html#lable1http://www.cnblogs.com/alex3714http://www.cnblogs.com/linhaifeng/p/7278389.htmlhttps://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 1.Python简介

爬虫入门之爬取策略 XPath与bs4实现(五)

爬虫入门之爬取策略 XPath与bs4实现(五) 在爬虫系统中,待抓取URL队列是很重要的一部分.待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面.而决定这些URL排列顺序的方法,叫做抓取策略.下面重点介绍几种常见的抓取策略: 1 深度优先遍历策略: 深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接.我们以下面的图为例:遍历的路径:A-F-G E-H-I B C D

2018用Python写网络爬虫(视频+源码+资料)

课程目标实现Python写网络爬虫入门适用人群数据零基础爱好者,职场新人 ,在校大学生课程简介1.基本Http请求以及验证方式分析 2.Python用于处理Html格式数据beautifulsoup模块3.Pyhton的requests模块的使用并实现爬取B站.网易云.微博.内涵段子等网站4.异步IO模块的使用,如:asyncio.gevent.aiohttp.twisted.torando 5.自定义异步IO模块 6.Scrapy框架的使用以及应用 下载地址:百度网盘 原文地址:http://

[python学习] 简单爬取维基百科程序语言消息盒

文章主要讲述如何通过Python爬取维基百科的消息盒(Infobox),主要是通过正则表达式和urllib实现:后面的文章可能会讲述通过BeautifulSoup实现爬取网页知识.由于这方面的文章还是较少,希望提供一些思想和方法对大家有所帮助.如果有错误或不足之处,欢迎之处:如果你只想知道该篇文章最终代码,建议直接阅读第5部分及运行截图. 一. 维基百科和Infobox 你可能会疑惑Infobox究竟是个什么东西呢?下面简单介绍. 维基百科作为目前规模最大和增长最快的开放式的在线百科系统,其典型

Python入门到实战 Python的修炼之道

Python的修炼之道(入门语法.游戏开发.网络编程) 课程讲师:小强老师 课程分类:Python 适合人群:初级 课时数量:43课时 用到技术:Python 涉及项目:数据库应用程序开发 游戏开发 咨询QQ:1337192913 课程设计思路及目标: 本课程以实际问题为核心进行组织和编写,以框图为工具来描述问题的解决步骤,最终用Python语言写出程序,旨在培养学员从整体上思考问题和把握问题,并以一种直观的方式描述问题的解决步骤,训练学员用简洁而快速的方式编写程序.本课程以培养学生的编程思想和

Python入门资料

转载:http://www.jianshu.com/p/7aa1d7fd08d6 一.学会使用搜索引擎,尤其是Google.推荐阅读文章 <如何用好Google搜索引擎?>知乎问答@崔凯 <十大高明的Google搜索技巧>by-雪影蓝风 <如何用好Google>by-李笑来 二.学会提问 推荐阅读<提问的智慧>by-啄木鸟社区 三.书籍推荐 零基础 Python官方文档点击打开链接英语不好的,暂时就先别看了,以后一定肯定要加强英语学习哦;). 推荐<H

【Python】网络爬虫(一):pyquery一瞥

1.pyquery简介 python中的pyquery模块语法与jquery相近,可用来解析HTML文件.官方文档地址:https://pythonhosted.org/pyquery/ .通过HTML中的标签.id.给定的索引等来获取元素,使得解析HTML文件极为方便. 2.实例 2.1 爬取豆瓣电影页面中主演 右键chrome中的审查元素,观察到主演的标签为<a href="/celebrity/1005773/" rel="v:starring">