java爬虫抓取动态网页(Python非常适合用来开发网页爬虫,理由:管理待爬取url)
优采云 发布时间: 2022-03-24 04:10java爬虫抓取动态网页(Python非常适合用来开发网页爬虫,理由:管理待爬取url)
前言
Python 非常适合开发网络爬虫,原因如下:
1、抓取网页本身的接口
相比其他静态编程语言,如java、c#、c++、python,爬取网页文档的界面更加简洁;与perl、shell等其他动态脚本语言相比,python的urllib包提供了更完善的web文档访问API。 (当然ruby也是不错的选择)
另外,爬取网页有时需要模拟浏览器的行为,很多网站都被屏蔽用于生硬的爬虫爬取。这就是我们需要模拟用户代理的行为来构造适当请求的地方,例如模拟用户登录、模拟会话/cookie存储和设置。 python中有非常好的第三方包可以帮助你,比如Requests,mechanize
2、网页抓取后的处理
爬取的网页通常需要处理,比如过滤html标签、提取文本等。Python的beautifulsoap提供了简洁的文档处理功能,可以用极短的代码完成大部分文档处理。
其实很多语言和工具都可以做到以上功能,但是python可以做到最快最干净。
人生苦短,你需要python。
PS:python2.x 与 python3.x 非常不同。本文只讨论python的爬虫实现方法3.x.
爬虫架构的组成
URL管理器:管理待爬取的url集合和已爬取的url集合,并将待爬取的url发送给网页下载器。
网页下载器(urllib):抓取url对应的网页,存储为字符串,发送给网页解析器。
网页解析器(BeautifulSoup):解析出有价值的数据,将其存储,并将url补充到URL管理器中。
运行过程
URL管理器基本功能存储方法
1、内存(python 内存)
要爬取的url集合:set()
抓取的url集合:set()
2、关系型数据库(mysql)
urls(url, is_crawled)
3、缓存(redis)
要爬取的url集合:set
抓取的网址集合:设置
大型互联网公司,由于缓存数据库的高性能,一般将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)
携带参数
新百度2.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)
美人汤
从网页中提取有价值的数据和新的 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's story
Once upon a time there were three little sisters; and their names were
Lacie and
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['class'])
3、指定标签、类或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'))
4、从文档中找到所有标签的链接
for link in soup.find_all('a'):
print(link.get('href'))
出现警告。根据提示,我们可以在创建BeautifulSoup对象时指定解析器。
5、获取文档中的所有文本
print(soup.get_text())
6、正则匹配
link_node = soup.find('a',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抓取自己写的爬虫包?
fiddler抓取python脚本的https包时出错?