php抓取网页匹配url( 爬虫模拟人对网页的操作方法)
优采云 发布时间: 2022-01-13 12:03php抓取网页匹配url(
爬虫模拟人对网页的操作方法)
使用Python爬取百度热搜信息
目录摘要
前言
什么是爬虫,其实就是用电脑模拟人在网页上的操作
例如,模拟人类浏览和购物网站
使用爬虫前一定要看清楚目标 网站 可罚但不可罚:-)
可以在目标网站中添加/robots.txt,查看网页的具体信息
比如查看天猫的输入
User-agent 代表发送请求的对象
星号 * 代表任何搜索引擎
Disallow 表示不允许访问的部分
/ 表示从根开始
Allow 表示允许访问的部分
在这个例子中,我爬取了百度热搜前30条新闻(我本来打算在英雄联盟首页数据中心爬取前50名英雄的英雄信息,但是无法实现延迟爬取网页的操作,但我只能爬百度热搜),它的一般信息放在Excel表格和Flask网页中,实现数据可视化。对数据可视化感兴趣的同学也可以爬取其他内容
由于我的水平有限,这个文章里面的爬虫都是比较基础的东西
库函数准备
如何安装 Python 库:
打开 cmd 命令提示符并输入 pip install XXX (这是你要安装的库的名称)
这些库的具体使用可以看我接下来的操作
只需要掌握几个常用功能
BS4
即美丽汤
用于解析 HTML 页面并提取指定数据。
后面我的demo里会看到详细的用法。
回覆
用于匹配字符串中的响应字符串的正则表达式。
关于正则表达式,可以去菜鸟教程详细介绍
urllib
它是 Python 自带的 HTTP 请求库,可以操作一系列 URL。
xlwt/xlrt
用于写入(写入)/读取(读取)Excel 表格中的数据。
烧瓶
该库用于制作一个简单的 Web 框架,即 网站 用于数据可视化。
其实我对数据可视化的把握也很浅薄,只是简单的将数据导入到网页中。
神社2
这个库的目的是实现在 HTML 页面的字符中插入参数的功能。
后端:
name="HQ"
前端:
<p>{{name}}长得真帅!
显示:
HQ长得真帅!</p>
标记安全
与 Jinja 一起使用以在渲染页面时避免不受信任的输入,防止注入攻击(尽管没有人会攻击你....)
数据抓取
数据爬取和数据可视化的两个py文件是分开的
数据爬取需要导入re bs4 urllib xlwt的四个库文件
网页抓取
使用下面的方法调用一个函数,让函数调用关系更清晰
if __name__=="__main__": #当程序执行时 调用一下函数
main()
def askurl(url):
head={
"User-Agent":"""Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55"""
}
#用户代理 告诉服务器我只是一个普普通通的浏览器
requset=urllib.request.Request(url)
#发送请求
response=urllib.request.urlopen(requset)
#响应的为一个request对象
#通过read()转化为 bytes类型字符串
#再通过decode()转化为 str类型的字符串
#接受响应
html=response.read().decode("utf-8")
将抓取到的网页存入文档中 方便观察
path=r"C:UsersXXXDesktopPython ext.txt"
#这里在字符串前加入r 防止字符串中的发生转义
f=open(r"path","w",encoding="utf-8")
f.write(html)
f.close()
#这样在txt文件中就可以查看网页的源码
return html
headers的值可以在网页中按F12
然后点击network change,下拉到底部任意request header,就是user-agent代理信息
值得注意的是,如果请求中没有设置headers,服务器会返回418状态码
表示服务器认出你是爬虫,说:“我是茶壶”
表示服务器拒绝煮咖啡,因为它总是一个茶壶(这是一个表情包)
数据分析
把抓到的txt文件后缀改成html作为本地网页打开
如果因为行太长导致vscode报错,可以参考以下博客
打开后的页面如图
使用该功能查看需要爬取信息的地方
在这个项目中,我们抓取目标信息的标题内容和链接
我们可以发现,我们需要的所有信息都在其类为以下类型的表中
所以我们使用 Beautifulsoup 来解析网页
def getData(html):
datalist=[]
soup=BeautifulSoup(html,"html.parser") #定义一个解析对象
#soup.find_all(a,b) 其中a为标签的类型 class_ 对div的class进行匹配
#返回的是所有class为category-wrap_iQLoo horizontal_1eKyQ的列表
for item in soup.find_all("div",class_="category-wrap_iQLoo horizontal_1eKyQ"):
item=str(item)
#将列表中每一个子标签转换为字符串用于re匹配
接下来,重新匹配每个项目
首先使用pile()创建匹配规则,然后使用findall进行匹配
通过查看HTML文件中目标信息前后的特殊字符创建匹配规则
而 (.*?) 是要与 * 匹配的字符串,后跟 ? 代表非贪心匹配
例如
标题前后的信息为省略号">和
其他都一样
<p>#匹配规则
#链接
findlink=re.compile(r" href="(.*?)" rel="external nofollow" target="_blank")
#标题
findtitle=re.compile(r"ellipsis"> (.*?) (.*?)