python高阶爬虫实战分析

关于这篇文章有几句话想说,首先给大家道歉,之前学的时候真的觉得下述的是比较厉害的东西,但是后来发现真的是基础中的基础,内容还不是很完全。再看一遍自己写的这篇文章,突然有种想自杀的冲动。emmm所以楼主决定本文全文抹掉重写一遍,并且为之前点进来看的七十多访问量的人,致以最诚挚的歉意。好想死。。

在学完了爬虫全部内容后,楼主觉得勉强有资格为接触爬虫的新人指指路了。那么废话不多说,以下正文:

一、获取内容

说爬虫一定要先说爬取内容的方法,python有这么几个支持爬虫的库,一个是urllib和它的后续版本库,这个库做爬取的时候生成的中继对象是比较多的,楼主也记不大住都有什么,而且这个库的使用在楼主看来有些过时了。更加建议做爬取的时候使用requests库(ps:不是request)

使用urllib:

html = urllib.request.urlopen(url).read()

使用requests:

r = requests.get(url)

对于获取到的内容,有以下方法进行处理:
1、使用正则表达式匹配。

2、使用BeautifulSoup对爬取内容标签对象化。

3、通过构造节点树使用Xpath获取元素。

第一种方法胜在直接,效率高而且不需要安装三方库。第二种方法胜在简单,标签对象化后不需要写复杂的正则表达式,而且提取标签更加方便。第三种方法胜在灵活,获取内容更加灵活,就是语法有点多,不熟的话可以对着Xpath语法文档写。

使用正则表达式匹配:

pattern_content = '<div class="rich_media_content " id="js_content">(.*?)</div>'
content1 = re.findall(pattern_content, html, re.S)

使用BeautifulSoup对爬取内容标签对象化:

soup = bs4.BeautifulSoup(html, 'lxml')
imgs = soup.find_all('img')

关于BeautifulSoup的安装请自行百度,没记错的话直接pip是可行的。

通过构造节点树使用Xpath获取元素:

selector=etree.HTML(html)
content=selector.xpath('//div[@id="content"]/ul[@id="ul"]/li/text()')

至此,爬取的基本内容就叙述完毕了,这里给出的是最简单的范例,如果想深入了解某种方法,建议去查询更详细的技术文档。

下面内容就是之前的了,略作删改。

二、伪造表单请求头

很多网站上的数据爬取比较简单,只需要直接request那个网址就可以,很多小型网站都是这样。面对这样的网站数据,只需要花个几分钟随便写几行代码,就能爬到我们想要的数据。

但是想要爬取稍微大型一些的网站数据,就不会这么容易了。这些网站的服务器,会分析收到的每一条request,来判断该请求是否为用户操作。这种技术,我们把它称为反爬技术。常见的反爬技术,楼主知道的有上面所述的分析请求,还有验证码技术。对于这两种情况,我们在构造爬虫程序的时候就需要稍微费点力气了。

先来介绍第一种的应对方法。首先我们要知道一条request的组成部分,不同网站的request格式可能会有点不同。对于这一点,我们可以通过浏览器的开发者工具,抓到一个网站的请求数据格式。如下图:

11111

此为使用谷歌浏览器抓取的请求信息。

我们可以看到request headers的格式,所以在访问这样的网站的时候,我们就不能忘了在postdata中放上一条伪造的headers。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0',
			  'Referer': 'Address'}

其中referer键对应的值是要访问的网址。

某些网站还会需要有cookie的用户验证,我们可以通过调用

requests.Session().cookies

来获得它。

如果在爬虫中需要提交某些信息的话,还要构造一下postdata的数据。比如这样:

postData = {
		'username': ul[i][0],
		'password': ul[i][1],
		'lt': b.group(1),
		'execution': 'e1s1',
		'_eventId': 'submit',
		'submit': '%B5%C7%C2%BC',
	}

三、关于多网页的爬取

如果网页地址有规律,那么构造url用个循环函数就好,对于网页地址中包含随机码的时候,通常就是先爬取根页面,获取到所有想爬取的子页面url,把这些url放进一个url池(项目小是一维的列表,项目大的时候可能会是高维的列表)里,循环爬取。

而比较高效的方式是使用多线程技术,demo有点长只贴关键部分。

class Geturl(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    res = requests.get(url, headers=header)
    html = res.text
    # print(html)
    pattern_href = '<a target="_blank" href="(.*?)" rel="external nofollow" id'
    href = re.findall(pattern_href, html, re.S)
    for href in href:
      href = href.replace('amp;', '')
      a.put(href)
      a.task_done()
class Spider(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    href = a.get()
    res = requests.get(href, headers=header2)
    html = res.text
    pattern_title = '<title>(.*?)</title>'
    title = re.findall(pattern_title, html, re.S)
    pattern_content = '<div class="rich_media_content " id="js_content">(.*?)</div>'
    content1 = re.findall(pattern_content, html, re.S)
    print(title)
    # time.sleep(1.5)
    pattern_content2 = '>(.*?)<'
    content2 = re.findall(pattern_content2, content1[0], re.S)
    while '' in content2:
      content2.remove('')
    content = ''
    for i in content2:
      content = content + i
    content = content.replace(' ','')
    print(content)

开两个线程,一个爬取url放进url池,一个从url池里获取url然后爬取内容,再开一个线程监控两个线程,如果两个线程运行完毕,结束主线程。

python的多线程机制底层做的其实不好,理由不多讲。另,多线程具体操作很多就不展开讲了。

四、关于使用代理ip

很多网站会有ip检测机制,当同一ip以人力无法做到的速度多次访问网站时,通常就会触发这种机制。

代理ip的话,通常通过爬取一些开源ip网站发布的ip构建ip代理池,比如西刺、蘑菇等。这样的一些网站,直接百度代理ip就能找到。然后,使用Flask+Redis维护代理池。这部分详细说明也比较长,就不细说了。也不是爬虫必要的东西。另,自己有服务器的也可以使用SSR的翻墙工具,不过搭建不是楼主亲手做的,所以就不详细说明了。

五、关于selenium模仿浏览器操作

关于selenium主要介绍以下几点:

1、selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。

2、Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

3、selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

4、用python写爬虫的时候,主要用的是selenium的Webdriver。

这些是某说明文档的内容,能看懂就看,看不懂就看楼主的简单版:

selenium的话主要用于模仿浏览器操作,比如向文本框中赋值,点击按钮等。配合高效率浏览器的话也是实现爬虫的一个比较好的方法。优点是通过模拟浏览器操作,不易被反爬检测。缺点是效率低下,非常不适合大型爬虫,小作坊自己玩玩就好。

六、关于Scrapy框架

这又是一块非常非常庞大的内容,很多技术一旦牵扯上框架就麻烦了。当然学会了的话,做大型项目就简单多了。重点就是框架一般针对比较大型的系统去做,所以其管理和操作会比较麻烦,内部的一些机制也不是很好说明。这一块的话如果以后有时间就单独写一篇文章详细介绍,毕竟从原理到搭建到配置到使用,内容太多。。

七、关于验证码处理

对于处理验证码的话,目前简单点的是直接使用PIL(pillow)做图像处理,然后使用Tesseract直接识别。此方法楼主已经写好了单独的文章供大家参考。

另,如果学过机器学习神经网络这部分的话,还可以使用卷积神经网络。这个方向楼主还正在学,简单给大家指条路,不详述。

以上是楼主想到的爬虫所有内容,若有错误还望指正。

(0)

相关推荐

  • Python常用库推荐

    IPython + ptpython,完美体验 首先是安装 pip install ipython ptpython 然后使用 ptipython 有什么好处 1. IPython 是非常强大的 Python 增强工具 2. ptpython 提供了类似 IDE 的自动补全功能 3. 当你在命令行输入 pyipython 时,便结合了这两者的功能,无比强大! virtualenv + virtualenvwrapper,轻松创建隔离环境 首先安装 pip install virtualenvwr

  • Python爬虫常用库的安装及其环境配置

    Python常用库的安装 urllib.re 这两个库是Python的内置库,直接使用方法import导入即可. 在python中输入如下代码: import urllib import urllib.request response=urllib.request.urlopen("http://www.baidu.com") print(response) 返回结果为HTTPResponse的对象: <http.client.HTTPResponse object at 0x0

  • Python爬虫框架scrapy实现的文件下载功能示例

    本文实例讲述了Python爬虫框架scrapy实现的文件下载功能.分享给大家供大家参考,具体如下: 我们在写普通脚本的时候,从一个网站拿到一个文件的下载url,然后下载,直接将数据写入文件或者保存下来,但是这个需要我们自己一点一点的写出来,而且反复利用率并不高,为了不重复造轮子,scrapy提供很流畅的下载文件方式,只需要随便写写便可用了. mat.py文件 # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractor impor

  • Python爬虫之正则表达式基本用法实例分析

    本文实例讲述了Python爬虫之正则表达式基本用法.分享给大家供大家参考,具体如下: 一.简介 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些匹配某个模式的文本. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表

  • Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requests url = 'https://list.tmall.com/search_product.htm?q=%CB%AE%BA%F8+%C9%D5%CB%AE&type=p&vmarket=&spm=875.7931836%2FA.a2227oh.d100&from=mal

  • Python爬虫PyQuery库基本用法入门教程

    本文实例讲述了Python爬虫PyQuery库基本用法.分享给大家供大家参考,具体如下: PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严格实现.语法与 jQuery 几乎完全相同,所以不用再去费心去记一些奇怪的方法了. 官网地址:http://pyquery.readthedocs.io/en/latest/ jQuery参考文档: http:

  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化的方法. 关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据. 1.成品图 这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M.爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图. 可以

  • python爬虫自动创建文件夹的功能

    该爬虫应用了创建文件夹的功能: #file setting folder_path = "D:/spider_things/2016.4.6/" + file_name +"/" if not os.path.exists(folder_path): os.makedirs(folder_path) 上面代码块的意思是: "os.path.exists(folder_path)"用来判断folder_path这个路径是否存在,如果不存在,就执行&

  • python高阶爬虫实战分析

    关于这篇文章有几句话想说,首先给大家道歉,之前学的时候真的觉得下述的是比较厉害的东西,但是后来发现真的是基础中的基础,内容还不是很完全.再看一遍自己写的这篇文章,突然有种想自杀的冲动.emmm所以楼主决定本文全文抹掉重写一遍,并且为之前点进来看的七十多访问量的人,致以最诚挚的歉意.好想死.. 在学完了爬虫全部内容后,楼主觉得勉强有资格为接触爬虫的新人指指路了.那么废话不多说,以下正文: 一.获取内容 说爬虫一定要先说爬取内容的方法,python有这么几个支持爬虫的库,一个是urllib和它的后续

  • Python高阶函数、常用内置函数用法实例分析

    本文实例讲述了Python高阶函数.常用内置函数用法.分享给大家供大家参考,具体如下: 高阶函数: 允许将函数作为参数传入另一个函数: 允许返回一个函数. #返回值为函数的函数 sum=lambda x,y:x+y sub=lambda x,y:x-y calc_dict={"+":sum,"-":sub} def calc(x): return calc_dict[x] print(calc('-')(5,6)) print(calc('+')(5,6)) #参数

  • 详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"翻译"所以格式编码的格式.Python3中

  • Python构建网页爬虫原理分析

    既然本篇文章说到的是Python构建网页爬虫原理分析,那么小编先给大家看一下Python中关于爬虫的精选文章: python实现简单爬虫功能的示例 python爬虫实战之最简单的网页爬虫教程 网络爬虫是当今最常用的系统之一.最流行的例子是 Google 使用爬虫从所有网站收集信息.除了搜索引擎之外,新闻网站还需要爬虫来聚合数据源.看来,只要你想聚合大量的信息,你可以考虑使用爬虫. 建立一个网络爬虫有很多因素,特别是当你想扩展系统时.这就是为什么这已经成为最流行的系统设计面试问题之一.在这篇文章中

  • python动态网站爬虫实战(requests+xpath+demjson+redis)

    目录 前言 一.主要思路 1.观察网站 2.编写爬虫代码 二.爬虫实战 1.登陆获取cookie 三.总结 前言 之前简单学习过python爬虫基础知识,并且用过scrapy框架爬取数据,都是直接能用xpath定位到目标区域然后爬取.可这次碰到的需求是爬取一个用asp.net编写的教育网站并且将教学ppt一次性爬取下来,由于该网站部分内容渲染采用了js,所以比较难用xpath直接定位,同时发起下载ppt的请求比较难找. 经过琢磨和尝试后爬取成功,记录整个爬取思路供自己和大家学习.文章比较详细,对

  • 详解Python高阶函数

    本文要点 1.什么是高阶函数 2.python中有哪些常用的高阶函数 什么是高阶函数? 在了解什么是高阶函数之前,我们来看几个小例子.我们都知道在 python 中一切皆对象,函数也不例外.比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数! 同理我们将 abs 指向另一个函数 abs = len,那么 abs 将不再是求绝对值的函数了,abs指向的是求长度的 len 函数.这说明函数名其实就

  • Python高阶函数与装饰器函数的深入讲解

    本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧 高阶函数 1.可以使用函数对象作为参数的函数 2.或可以将函数作为返回值的函数 3.函数对象:定义好的函数,使用函数名调用(不要加括号) #将函数作为参数的高阶函数,通过传入不同的函数,可以使执行的结果不同 4.内置高阶函数 (1)map数据映射函数 map函数接收的是两个参数,一个函数,一个序列,其功能是将序列中的值处理再依次返回至列表内.其返回值为一个迭代器对象 (2)reduce

  • python 高阶函数简单介绍

    把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现.函数式编程就是指这种高度抽象的编程范式. 1.体验高阶函数 在Python中,abs()函数可以完成对数字求绝对值计算. abs(-10) # 10 round()函数可以完成对数字的四舍五入计算. round(1.2) # 1 round(1.9) # 2 需求:任意两个数字,按照指定要求整理数字后再进行求和计算. 方法1 def add_num(a, b): return abs(a) + abs(b) result =

  • python高阶函数使用教程示例

    目录 一.高阶函数 函数定义 函数名可作为返回值.也可作为参数 (1)函数名作为参数 (2)函数名作为返回值 二.常用的高阶函数 (1)map(function,iterable) (2)filter(function, iterable) (3)reduce(function, iterable) 一.高阶函数 函数定义 python中,函数名是变量,下方这个method函数名看成变量,指向一个计算的函数!因此函数名其实就是指向函数的变量,故变量可指向函数: 变量可指向函数,且函数的变量可接受

  • Kotlin中Lambda表达式与高阶函数使用分析讲解

    目录 Lambda表达式 高阶函数 小结 编程语言的发展,通过需求,不断的变化出新的特性,而这些特性就会使得编程变得更加的简洁. Lambda表达式 Lambda表达式的出现,一定程度上使得函数和变量慢慢的融为一体,这样做的好处大大的方便了回调函数的使用. 在很多的情况下,其实我们的函数就只有简单的几行代码,用fun就感觉有点重了,而且有的时候这么大的函数结构用起来,并不是非常的方便. Lambda表达式,其表达式为: {变量定义 -> 代码块} 其中: lambda 函数是一个可以接收任意多个

随机推荐