python抓取网页数据(Python非常适合用来开发网页爬虫,理由:管理待爬取url)

优采云 发布时间: 2021-12-23 01:19

  python抓取网页数据(Python非常适合用来开发网页爬虫,理由:管理待爬取url)

  前言

  Python非常适合开发网络爬虫,原因如下:

  1、 抓取网页本身的界面

  与java、c#、c++、python等其他静态编程语言相比,抓取网页文档的界面更加简洁;相较于其他动态脚本语言,如 perl、shell,python 的 urllib 包提供了更完整的 web 文档 API 访问。(当然*敏*感*词*也是不错的选择)

  另外,爬取网页有时需要模拟浏览器的行为,很多网站都是为了生硬爬取而被屏蔽的。这就是我们需要模拟用户代理的行为来构造合适的请求的地方,比如模拟用户登录,模拟会话/cookie存储和设置。python中有优秀的第三方包帮你搞定,比如Requests,mechanize

  2、网页爬取后的处理

  抓取到的网页通常需要进行处理,如过滤html标签、提取文本等。Python的beautifulsoap提供了简洁的文档处理功能,可以用极短的代码完成大部分文档处理。

  其实很多语言和工具都可以做到以上功能,但是python可以做到最快最干净。

  人生苦短,你需要python。

  PS:python2.x 与 python3.x 非常不同。本文只讨论python3.x的爬虫实现方法。

  爬虫架构的组成

  

  网址管理器:管理待抓取网址的集合和已抓取网址的集合,并将待抓取的网址发送给网页下载器。

  网页下载器(urllib):抓取url对应的网页,存储为字符串,发送给网页解析器。

  网页解析器(BeautifulSoup):解析出有价值的数据并存储,同时将url添加到URL管理器中。

  运行过程

  

  URL管理器基本功能存储方法

  1、内存(python内存)

  要爬取的URL集合:set()

  爬取的 url 集合:set()

  2、关系型数据库(mysql)

  网址(网址,is_crawled)

  3、缓存(redis)

  要抓取的网址集合:设置

  抓取的网址集合:设置

  由于缓存数据库的高性能,大型互联网公司通常将URL存储在缓存数据库中。小公司通常将 URL 存储在内存中。如果他们想永久存储它们,请将它们存储在关系数据库中。

  网页下载器 (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,可以打印出得到的页面。

  构造请求

  上面的代码可以修改为:

  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不支持代理环境下访问https。但是,最新版本应该支持它。那么,最简​​单的方法就是更改一个使用http协议进行爬取的URL,例如替换为。结果还是报错,但是变成了400错误。

  

  然而,然而,然而。. . 神的转折点出现了!!!

  当我将url更改为时,请求成功!没错,只需在 URL 后添加一个额外的斜杠 / 即可。同理,如果改成,请求也是成功的!魔法!!!

  添加处理器

  

  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 列表。

  解析器选择

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

  其中,正则表达式基于模糊匹配,而其他三个基于DOM结构分析。

  BeautifulSoup 安装测试

  1、安装,在命令行下执行pip install beautifulsoup4。

  2、测试

  import bs4

print(bs4)

  使用说明

  

  

  基本用法

  1、创建一个 BeautifulSoup 对象

  import bs4

from bs4 import BeautifulSoup

# 根据html网页字符串创建BeautifulSoup对象

html_doc = """

The Dormouse's story

<p class="title">The Dormouse&#39;s story

  Once upon a time there were three little sisters; and their names were

Elsie,

Lacie and

Tillie;

and they lived at the bottom of a well.

  ...

"""

soup = BeautifulSoup(html_doc)

print(soup.prettify())</p>

  2、访问节点

  print(soup.title)

print(soup.title.name)

print(soup.title.string)

print(soup.title.parent.name)

print(soup.p)

print(soup.p[&#39;class&#39;])

  3、指定标签、类或id

  print(soup.find_all(&#39;a&#39;))

print(soup.find(&#39;a&#39;))

print(soup.find(class_=&#39;title&#39;))

print(soup.find(id="link3"))

print(soup.find(&#39;p&#39;,class_=&#39;title&#39;))

  4、从文档中查找所有标签的链接

  for link in soup.find_all(&#39;a&#39;):

print(link.get(&#39;href&#39;))

  

  有警告。根据提示,我们只需要在创建 BeautifulSoup 对象时指定解析器即可。

  5、从文档中获取所有文本内容

  print(soup.get_text())

  6、正则匹配

  link_node = soup.find(&#39;a&#39;,href=re.compile(r"til"))

print(link_node)

  后记

  Python爬虫的基础知识到此就足够了。接下来,在实战中学习更多的进阶知识。

  书签

  Python开发简单爬虫

  Python 标准库

  美汤4.2.0个文档

  为什么python适合写爬虫?

  如何学习Python爬虫【介绍】?

  你需要这些:Python3.x爬虫学习资料整理

  如何开始使用 Python 爬虫?

  Python3.X 抓取网络资源

  python网络请求和“HTTP错误504:提琴手接收失败”

  如何使用Fiddler抓取自己写的爬虫包?

  fiddler抓取python脚本的https包时出现错误?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线