Python爬虫技术

目录
  • 一、Python爬虫简单介绍
    • 1、抓取网页本身的接口
    • 2、网页抓取后的处理
  • 二、爬虫架构
  • 三、URL管理器
    • 1、基本功能
    • 2、存蓄方式
    • 3、网页下载器(urllib)
  • 四、网页解析器(BeautifulSoup)
    • 1、解析器选择
    • 2、BeautifulSoup
    • 3、使用说明

一、Python爬虫简单介绍

1、抓取网页本身的接口

相比与其他静态的编程语言,如java,c#,C++,python抓取网页的接口更简洁;相比其他动态脚本语言,如Perl,shell,python的urllib包提供了较为完整的访问网页文档的API。(当然ruby也是很好的选择)此外,抓取网页有时候需要模拟游览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。这是我们需要模拟user agen的行为构造合适的请求,譬如模拟用户登录、模拟session/cookie的存蓄和设置。在Python里都有非常优秀的第三方包帮你搞定,如Request,mechanize。

2、网页抓取后的处理

抓取的网页通常需要处理,比如过滤html标签,提取文本等。Python的beautiulsoap提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理。
其实以上功能很多的语言都能做,但是用Python能够干得最快,最干净。

Life is short, you need python.

PS:python2.x和python3.x有很大不同,本文先讨论python3.x的爬虫实现方法。

二、爬虫架构

架构组成
URL管理器:管理待爬的url集合好已爬取的url集合,传送待爬的url给网页下载器。
网页下载器(urllib):爬取url对应的网页你,存蓄成字符串,传送给网页解析器。
网页解析器(BeautifulSoap):解析出有价值的数据,存蓄下来,同时补充url到URL管理器。

三、URL管理器

1、基本功能

添加新的url到爬取url集合中。
判断待添加的url是否在容器中(包括待爬取url集合和已爬取的url集合)。
获取待爬取的url。
判断是否有待爬取的url。
将爬取完成的url从待爬取的url集合移动到已爬取url集合。

2、存蓄方式

内存(python内存)
待爬取url集合:set()
已爬取url集合:set()
关系数据库(mysql)
urls(url,is_crawled)
缓存(redis)
待爬取url集合:set
已爬取url集合:set
大型互联网公司,由于缓存数据库的高性能,一般把url存蓄在缓存数据库中。小型公司,一般把url存蓄在内存中,如果想要永存存蓄,则存蓄到关系数据库中。

3、网页下载器(urllib)

将url对应网页下载到本地,存蓄成一个文件或字符串。

基本方法
新建baidu.py,内容如下:

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
buff = response.read()
html = buff.decode("utf8")
print(html)
命令行中执行python baidu.py,则可以打印出获取到的网页。

构造Request:

上面的代码,可以修改为:

import urllib.request

request = urllib.request.Request('http://www.baidu.com')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)

携带参数:
新建baidu2.py,内容如下:

import urllib.request
import urllib.parse

url = 'http://www.baidu.com'
values = {'name': 'voidking','language': 'Python'}
data = urllib.parse.urlencode(values).encode(encoding='utf-8',errors='ignore')
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' }
request = urllib.request.Request(url=url, data=data,headers=headers,method='GET')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)

使用Fiddler监听数据:

我们想要查看一下,我们的请求是否真的携带了参数,所以需要使用fiddler。
打开fiddler之后,却意外发现,上面的代码会报错504,无论是baidu.py还是baidu2.py。
虽然python有报错但是在fiddler中,我们可以看到请求信息,确实携带了参数。
经过寻找资料,发现python以前版本的Request都不支持代理环境下访问https。但是,最近的版本应该支持了才对。那么,最简单的办法,就是换一个使用http协议的url来爬取,比如,把http://www.baidn.com改成http://www.baidu.com/,请求成功了!神奇!!!

添加处理器:

import urllib.request
import http.cookiejar

# 创建cookie容器
cj = http.cookiejar.CookieJar()
# 创建opener
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
# 给urllib.request安装opener
urllib.request.install_opener(opener)

# 请求
request = urllib.request.Request('http://www.baidu.com/')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)
print(cj)

四、网页解析器(BeautifulSoup)

从网页中提取有价值的数据和新的url列表。

1、解析器选择

为了实现解析器,可以选择使用正则表达式、html.parser、BeautifulSoup、lxml等,这里我们选择BeautfulSoup。

其中,正则表达式基于模糊匹配,而另外三种则是基于DOM结构化解析。

2、BeautifulSoup

安装测试
(1)安装,在命令行下执行pip install beautifulsoup4。

(2)测试。

import bs4
print(bs4)

3、使用说明

创建BeautifulSoup对象:

import bs4
from bs4 import BeautifulSoup

# 根据html网页字符串创建BeautifulSoup对象
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="//www.jb51.net/admin/index.asp" class="sister" id="link1">Elsie</a>,
<a href="//www.jb51.net/admin/index.asp" class="sister" id="link2">Lacie</a> and
<a href="//www.jb51.net/admin/index.asp" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc)
print(soup.prettify())

访问节点;

print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)

print(soup.p)
print(soup.p['class'])

指定tag、class或id:

print(soup.find_all('a'))
print(soup.find('a'))
print(soup.find(class_='title'))
print(soup.find(id="link3"))
print(soup.find('p',class_='title'))

从文档中找到所以<a>标签的链接:

for link in soup.find_all('a'):
    print(link.get('href'))

出现了警告,根据提示,。我们在创建BeautifulSoup对象时,指定解析器即可。

soup = BeautifulSoup(html_doc,'html.parser')

从文档中获取所以文字内容:

print(soup.get_text())

正则匹配:

link_node = soup.find('a',href=re.compile(r"til"))
print(link_node)

到此这篇关于Python爬虫技术的文章就介绍到这了,更多相关Python爬虫内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Python读取微信朋友圈的多种方法总结

    目录 背景 法1,不适用 法2,已不能用 法3:Appnium 法4:模拟操作 整体代码 后续工作及扩展 总结 背景 由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下. 目前爬取有四种方法,我们一一来分析一下. 法1,不适用 加某个微信号为好友,给这个微信号查看自己朋友圈的权限,然后那个微信号会把你自己朋友圈生成一个链接给你.一来这个和我需求不同,我是要爬取我好友的朋友圈,不是我自己的朋友圈,二来这个套路明显是公众号吸粉的套路,这个方法舍弃... 法2,已不能用 原理是在PC上操作,然后

  • python实现邮箱发送信息

    本文实例为大家分享了python实现邮箱发送信息的具体代码,供大家参考,具体内容如下 一.SSL SSL 是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料.两个系统可能是指服务器和客户端(例如,浏览器和购物网站),或两个服务器之间(例如,含个人身份信息或工资单信息的应用程序). 二.SMTP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组

  • python库sklearn常用操作

    目录 前言 一.MinMaxScaler 前言 sklearn是python的重要机器学习库,其中封装了大量的机器学习算法,如:分类.回归.降维以及聚类:还包含了监督学习.非监督学习.数据变换三大模块.sklearn拥有完善的文档,使得它具有了上手容易的优势:并它内置了大量的数据集,节省了获取和整理数据集的时间.因而,使其成为了广泛应用的重要的机器学习库. sklearn是一个无论对于机器学习还是深度学习都必不可少的重要的库,里面包含了关于机器学习的几乎所有需要的功能,因为sklearn库的内容

  • python3 使用OpenCV计算滑块拼图验证码缺口位置(场景示例)

    前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip installl opencv-python OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了很多处理图片.视频的方法. OpenCV库提供了一个方法(matchTemplate()):从一张较大的图片中搜索一张较小图片,计算出这张大图上各

  • Python使用psutil库对系统数据进行采集监控的方法

    大家好,我是辰哥- 今天给大家介绍一个可以获取当前系统信息的库--psutil 利用psutil库可以获取系统的一些信息,如cpu,内存等使用率,从而可以查看当前系统的使用情况,实时采集这些信息可以达到实时监控系统的目的. psutil库 psutil的安装很简单 pip install psutil psutil库可以获取哪些系统信息? psutil有哪些作用 1.内存使用情况 2.磁盘使用情况 3.cpu使用率 4.网络接口发送接收流量 5.获取当前网速 6.系统当前进程 ... 下面通过具

  • 一些让Python代码简洁的实用技巧总结

    目录 前言 1. 使用Lambda来修改Pandas数据框中的值 2. 使用f-string来连接字符串 3. 用Zip()函数对多个列表进行迭代 4. 使用列表理解法 5. 对文件对象使用with语句 6. 停止使用方括号来获取字典项, 利用.get()代替 7. 多重赋值 总结 前言 众所周知,编写Python代码在开始时十分容易,但随着你在工具包中添加更多的库,你的脚本可能会有不必要的代码行,变得冗长而混乱.可能短期内能够应付工作,但长期来看,麻烦不小. 在这篇文章中,我将与你分享7个技巧

  • Python Pytest装饰器@pytest.mark.parametrize详解

    Pytest中装饰器@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化,类似DDT 如:@pytest.mark.parametrize('请求方式,接口地址,传参,预期结果',[('get','www.baidu.com','{"page":1}','{"code":0,"msg":"成功"})',('post','www.baidu.com','{"page"

  • 详解python关于多级包之间的引用问题

    首先得明确包和模块. 包:在一个目录下存在__init__.py,那么该目录就是一个包. 模块:一个.py文件就是一个模块. 我们可以通过from 包 import 模块来引入python文件,也可以使用from 包.模块 import 模块中的函数或类. 具体看一下例子. 假设我们现在有以下的目录: 我们想在main.py中使用package_a和package_b里面额模块,可以这么使用: from package_a import tmp2 from package_b import tm

  • python编写adb截图工具的实现源码

    目录 一. 功能 二.使用说明 三.实现 1.初始源码 2.优化:增加ip连接断开重连处理 一. 功能 Android端或者Android终端的远程截图至本地电脑中 二.使用说明 1.adb截图工具可用于Android手机及Android终端 2.使用数据线连接前提:电脑与Android终端/手机已连接 Android终端/手机已打开开发者模式 3.生成的图片格式为png 三.实现 1.初始源码 import time import os,sys #截图 def screencap_cmd(fi

  • Python中的异常类型及处理方式示例详解

    目录 前言 正文 一.什么是异常 二.异常的类型 三.异常处理 四.try 介绍 五.finally 介绍 六.raise 介绍 结尾 前言 Python 是一种面向对象的.解释型的.通用的.开源的脚本编程语言.现在市面上 Python 非常的流行,主要是因为它简单易用,学习成本低,比如要实现某个功能,Python 可能只需要几行代码,而用C语言可能需要上百行代码,因为C语言什么都要得从头开始编码,而 Python 已经内置了很多功能模块,所以,我们只需要导入特定的包,就可以实现想要的效果. 正

随机推荐