爬虫简介


爬虫:一段自动抓取互联网信息的程序。

什么意思呢?

互联网是由各种各样的网页组成。每一个网页对应一个URL,而URL的页面上又有很多指向其他页面的URL。这种URL之间相互的指向关系就形成了一个网络,这就是互联网。

正常情况下就是我们采用人工点击的方式,去获取互联网上指定的信息,这种方式的特点是覆盖面小。

那有没有可能有一种方式,是当我们设定了一个互联网上感兴趣的目标,然后自动地从互联网上去获取我们所需要的数据呢?

有,这就是爬虫。它可以从一个URL出发访问该URL所关联的所有URL,并且从每个页面上提取出我们所需要的价值数据。

也就是说,爬虫就是自动访问互联网,并且提取数据的程序。

爬虫技术的价值


互联网数据,为我所用。

Python简单爬虫架构


1)首先,我们需要一个爬虫调度端。爬虫调度端的作用:启动爬虫,停止爬虫,监视爬虫运行情况。

2)在爬虫程序中有三个模块:URL管理器、网页下载器、网页解析器。

3)URL管理器:对将要爬取的和已经爬取过的URL进行管理;可取出待爬取的URL,将其传送给“网页下载器”。

4)网页下载器:将URL指定的网页下载,存储成一个字符串,在传送给“网页解析器”。

5)网页解析器:解析网页可解析出

    ①有价值的数据

    ②另一方面,每个网页都包含有指向其他网页的URL,解析出来后可补充进“URL管理器”

此时,这三个模块就形成了一个循环,只要有感兴趣的URL,这三个模块就会一直循环下去。

Python简单爬虫架构的动态运行流程(以时序图的方式展示)


Python爬虫URL管理


URL管理器:管理待抓取URL集合和已抓取URL集合。

目的:防止重复抓取、防止循环抓取。

Python爬虫URL管理器的实现方式


Python爬虫URL管理器的实现方式具体有三种:

1)使用内存,在Python中主要使用set集合(方便去除重复的元素)

2)使用关系数据库,使用两个字段:url和is_crawled(用来标记是否被爬取)

3)使用缓存数据库,同样使用set集合

其中,大型公司一般选择高性能的缓存数据库。个人,小公司一般使用内存。若是想永久存储,常使用关系数据库。

Python爬虫网页下载器简介


网页下载器:一个工具,通过URL将互联网上对应的的网页以HTML的形式下载到本地存储成本地文件或内存字符串,后进行后续处理;

Python有哪几种网页下载器:urllib2(Python官方模块,基础模块)、requests(第三方模块,功能强大)。

Python爬虫urlib2下载器网页的三种方法


1)urllib2下载网页方法1:最简洁方法

将url直接传给urllib2的urlopen()方法。

对应代码:

2)urllib2下载网页方法2:除url外,添加data、http header。

进行增强处理。

其中,data向服务器提交需要用户输入的数据。

http header用来向服务器提交http的头信息。

对应代码:

代码中request.add_data('a','1')  #添加的数据类型为键值对,即a=1。

request.add_header()  #可以对url请求进行伪装

3)urllib2下载网页方法3:添加特殊情景的处理器

更大更强的功能处理能力。

对应代码(举例:增强cookie的处理)

Python爬虫urlib2实例代码演示


import urllib2, cookielib
url ="http://www.baidu.com"
print '第一种方法'
respones1 = urllib2.urlopen(url)
print respones1.getcode()
print len(respones1.read())
print "第二种方法"
request = urllib2.Request(url)
request.add_header("user-agent","Mozillla/5.0")
respones2 = urllib2.urlopen(request)
print respones2.getcode()
print len(respones2.read()) print '第三种方法'
cj =cookielib.CookieJar()
opener = urllib2.bulid_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
print respones3.getcode()
print cj
print respones3.read()

Python爬虫网页解析器简介


网页解析器:从网页中提取有价值数据的工具。

功能:

1)提取出新的待爬取URL列表;

2)解析出有价值的数据:

网页解析器会以下载好的html网页字符串作为输入,提取出有价值的数据以及新的待爬取的URL列表。

Python有哪些网页解析器呢?

1)正则表达式。最直观的一种。将网页文档down成一个字符串,采用模糊匹配的方式进行提取有价值的数据。虽然直观,但是当网页文档十分复杂的时候,这种方式将十分复杂。

2)使用Python自带的html.parser模块进行解析。

3)使用Beautiful Soup这个第三方插件来解析网页。功能强大的Beautiful Soup可以用html.parser或者lxml作为它的解析器。

4)使用lxml这个第三方插件来解析html网页或者xml文档。

结构化解析——DOM(DOcument Object Model)树

BeautifulSoup第三方模块


BeautifulSoup官网:https://www.crummy.com/software/BeautifulSoup/

安装BeautifulSoup:

如果你安装了pip,那么就简单了,无需从官网下载,打开命令提示符页面。

进入到Python安装目录下的Scripts文件夹路径下,输入“pip install beautifulsoup4”,即可进行自动安装。

安装完,在eclipse中进行测试,新建一个Python模块,输入:

import bs4
print bs4

输出为:

证明安装成功。

BeautifulSoup的语法


其中搜索节点的find_all()方法可以搜索出所有符合要求的节点,而find()方法则只是搜索出符合条件的第一个节点。但是两个函数的参数是完全相同的。

对应代码:

1)创建BeautifulSoup对象

2)搜索节点(find_all、find)

其中红色部分为正则表达式形式。

最后一句之所以"class_"要加上下划线是因为要和Python的关键字"class"进行区分。

3)访问节点信息

4)BeautifulSoup的实例测试

# coding:utf-8
from bs4 import BeautifulSoup
import re
print("Python3 的代码如下")
html_doc = """
因字数限制,省略。请到 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree 复制吧
""" soup = BeautifulSoup(html_doc, 'html.parser')
print("获取所有的链接")
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text()) print("获取lacie的链接")
link_node = soup.find('a', href="http://example.com/lacie")
print(link_node.name, link_node['href'], link_node.get_text())
print("正则匹配")
link_node = soup.find('a', href=re.compile(r"ill"))
print(link_node.name, link_node['href'], link_node.get_text()) print("获取p段落文字")
p_node = soup.find('p', class_="title")
print(p_node.name, p_node.get_text())

实战演练:爬取百度百科1000个页面的数据


1) 实例爬虫操作步骤

2)Python爬虫实例-分析目标

本篇博客参考慕课网课程:https://www.imooc.com/video/10683

Python开发爬虫之理论篇的更多相关文章

  1. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  2. 【转】Eclipse和PyDev搭建完美Python开发环境(Ubuntu篇)

    原文网址:http://www.cnblogs.com/Realh/archive/2010/10/10/1847251.html 前两天在Windows下成功地搭好了一个Python开发环境,这次转 ...

  3. Python开发【第二十三篇】:持续更新中...

    Python开发[第二十三篇]:持续更新中...

  4. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  5. Python开发【第二十篇】:缓存

    Python开发[第二十篇]:缓存redis&Memcache   点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...

  6. Python开发【第十三篇】:jQuery--无内容点击-不进去(一)

    Python开发[第十三篇]:jQuery--无内容点击-不进去(一)

  7. Python开发【第十篇】:CSS --无内容点击-不进去(一)

    Python开发[第十篇]:CSS  --无内容点击-不进去(一)

  8. BT网站--Python开发爬虫代替.NET

    BT网站-奥修磁力-Python开发爬虫代替.NET写的爬虫,主要演示访问速度和在一千万左右的HASH记录中索引效率. IBMID 磁力下载- WWW.IBMID.COM  现在用的是Python + ...

  9. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

随机推荐

  1. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  2. 再谈反向传播(Back Propagation)

    此前写过一篇<BP算法基本原理推导----<机器学习>笔记>,但是感觉满纸公式,而且没有讲到BP算法的精妙之处,所以找了一些资料,加上自己的理解,再来谈一下BP.如有什么疏漏或 ...

  3. Oracle数据库备份及还原

    Oracle数据库备份 1:找到Oracle安装路径我的就是默认C盘  C:\app\wdjqc\admin\orcl\adump 2:执行文件:back.bat 文件内容如下: @echo off ...

  4. ansible基础-Jinja2模版 | 测试

    一 简介 注:本文demo使用ansible2.7稳定版 Jinja2的测试语句被用来评估一个条件表达式,并且最终返回True或False,经常和「when」语句搭配使用. 测试语句和过滤器的相同点: ...

  5. [Swift]LeetCode678. 有效的括号字符串 | Valid Parenthesis String

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  6. Thrift 代码分析

    Thrift的基本结束 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interface Definiti ...

  7. Python 使用图灵机器人实现微信聊天功能

    首先需要去图灵官网创建一个属于自己的机器人然后得到apikey. 一.自动与指定好友聊天 # -*- coding: utf-8 -*- """ Created at 2 ...

  8. Netty(一) SpringBoot 整合长连接心跳机制

    前言 Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty. 最终能达到的效果: 客户端每隔 N 秒检测是否需要发送心跳. 服务端也每隔 N ...

  9. AspNetCore 基于流下载文件与示例代码

    昨天说了,AspNetCore如何进行上传文件,其中写了两种方式ajax与模型,其文章地址为:https://www.cnblogs.com/ZaraNet/p/9949167.html 那么既然有上 ...

  10. Java导出CSV文件

    以前导出总是用POI导出为Excel文件,后来当我了解到CSV以后,我发现速度飞快. 如果导出的数据不要求格式.样式.公式等等,建议最好导成CSV文件,因为真的很快. 虽然我们可以用Java再带的文件 ...