Python实践 - 网络爬虫笔记 - 2、从网站上爬取公开信息
Python实践笔记 - 2、从网站上爬取公开信息
张板书的Python的实践笔记,包括笔记与DeBug的经历。
为了完成一个比较麻烦的实习任务,尝试着做了这样一个爬虫项目。
任务要求之一是要检索安徽省应急管理厅的政务公开中,记录下所有的发放了危险化学品安全许可证的企业名称,但是检索后可以看到安徽省的信息是按周发布,那么如果要拿到所有的企业名称,就需要打开50+个网页,比较麻烦,故希望设计一个爬虫来解决。
http://yjt.ah.gov.cn/public/column/9377745?type=4&action=list&nav=3&catId=49550951
目录
- Python实践笔记 - 2、从网站上爬取公开信息
- 一、单个网页的信息获取
- 获取 xpath 来定位信息
- 二、获取所有的url
- 1、通过 post 请求获取信息
- 2、翻页 url 不变的爬虫
一、单个网页的信息获取
我们打开其中几个网页,可以看到格式都很规整,均是以一个表格的形式来进行信息的展示:
http://yjt.ah.gov.cn/public/9377745/146123891.html
http://yjt.ah.gov.cn/public/9377745/146123631.html
获取 xpath 来定位信息
使用谷歌浏览器或Edge浏览器的开发者工具( F12 或 Fn + F12 )
- 1、选择 元素检索 工具;
- 2、 光标放到需要的元素上;
- 3、需要的元素会显示在右侧;
找另一个不止有一行表格的文件,用元素检索工具看表格中每一行的 Xpath :
如此在程序中可以用循环来遍历每一行的信息
- 右键 — 复制 — 复制 xpath
在这里我们复制表格上一级的 xpath,即 tbody 那一项,xpath为:
//*[@id=“zoom”]/table/tbody
在 python 中创建一个函数来爬取此界面中的所有公司名称:
import requests
import json
from lxml import etreedef paqu_AH(url): # 根据 url 爬取表格中的公司名称headers = {'referer':'http://yjt.hubei.gov.cn/fbjd/xxgkml/xkfw/xzxkgs/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}html = requests.get(url, headers=headers).contentxml = etree.HTML(html)factorys = []xpath = '//*[@id="zoom"]/table/tbody'content = xml.xpath(xpath) # 用 xpath 解析 get 到的网页信息for tbody in content[0][1:]: # 具体信息可以打印出来看,或者用 vscode debug时的元素检测查看;# 同时 [1:] 表示除了第一行(因为第一行是表格的表头factorys.append(tbody[2].text) # [2]表示第二列,主要看网页结构return factorysAH_0 = "http://yjt.ah.gov.cn/public/9377745/146080571.html"
print(paqu_AH(AH_0)) >>>['安徽兴欣新材料有限公司', '铜陵华兴精细化工有限公司', '淮北绿洲新材料有限责任公司', '马鞍山神剑新材料有限公司', '安徽禹泰化工有限公司']
二、获取所有的url
1、通过 post 请求获取信息
如上文所说,单纯爬取一个表格的网页很简单,但是我们要爬取的是所有的信息,那么也就需要爬取所有的此类网页的 url
我们观察这个网页,发现公示危化品许可证网页关键词的有相同的格式:
故我们在这个网页上面的搜索中检索这些关键词:
年 月 周危险化学品安全生产许可证发放情况一览表
可以看到符合我们的猜测:
同样使用开发者工具获取 xpath,这样就可以使用程序爬取当页的内容了
而这次由于不是直接在本界面进行的爬取,使用的请求不是 get,而是使用了 post 请求:
import requests
import json
from lxml import etreedef paqu_URL(url,data): # 子函数,爬取 url 的应用层URLS = []num = 0headers = {'referer':'http://yjt.hubei.gov.cn/fbjd/xxgkml/xkfw/xzxkgs/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}html = requests.post(url, headers=headers, data=data).contentxml = etree.HTML(html)xpath = '//*[@id="xxgk_lmcon"]/div[1]/ul'txt = xml.xpath(xpath)for ul in txt:for li in ul[:-1]:content = li[0]dic = content.attribURLS.append(dic['href'])num += 1print("-- {} -- ".format(num),dic['href'])AH = "http://yjt.ah.gov.cn/public/column/9377745?type=4&action=list&nav=3&catId=49550951"
data = "年 月 周危险化学品安全生产许可证发放情况一览表".encode("utf-8") # 这里要加上编码方式,否则会报错
paqu_URL(AH,data)>>>-- 1 -- http://yjt.ah.gov.cn/public/9377745/146126481.html
>>>-- 2 -- http://yjt.ah.gov.cn/public/9377745/146123891.html
>>>-- 3 -- http://yjt.ah.gov.cn/public/9377745/146123631.html
>>>-- 4 -- http://yjt.ah.gov.cn/public/9377745/146120821.html
>>>-- 5 -- http://yjt.ah.gov.cn/public/9377745/146115731.html
>>>-- 6 -- http://yjt.ah.gov.cn/public/9377745/146115701.html
>>>-- 7 -- http://yjt.ah.gov.cn/public/9377745/146115601.html
>>>-- 8 -- http://yjt.ah.gov.cn/public/9377745/146115461.html
>>>-- 9 -- http://yjt.ah.gov.cn/public/9377745/146101311.html
>>>-- 10 -- http://yjt.ah.gov.cn/public/9377745/146101251.html
>>>-- 11 -- http://yjt.ah.gov.cn/public/9377745/146101261.html
>>>-- 12 -- http://yjt.ah.gov.cn/public/9377745/146094421.html
>>>-- 13 -- http://yjt.ah.gov.cn/public/9377745/146094401.html
>>>-- 14 -- http://yjt.ah.gov.cn/public/9377745/146080931.html
>>>-- 15 -- http://yjt.ah.gov.cn/public/9377745/146080571.html
但是由于不是以一页全部显示检索内容的,而且观察本页的 url,发现 url 中没有检索的关键词“年 月 周危险化学品安全生产许可证发放情况一览表”,而且翻页之后在 url 上没有体现,这样就无法直接在 url 上变化来实现翻页。
2、翻页 url 不变的爬虫
使用开发者工具监测网页动作:
- 1、打开开发者工具中的 网络;
- 2、在检索框中输入检索内容;
- 3、点击检索;
- 4、发现网页有发送的信息与相关的响应;
点进去这个响应,可以看到他的响应内容预览确实是检索结果:
点进表头中去,观察发送的信息,并根据表头名称猜测参数意义:
分析可得,可是试用 post 请求,而请求的信息发送这里的表头文件,并更改相应参数就可以实现翻页或其他功能:
import requests
import json
from lxml import etreedef get_all_url(num): # 爬取所有公式url i = 1url_list = []for i in range(num):print("#####第 {} 组###########################".format(i))request_dic = {'IsAjax': 1,'dataType': 'html','_': '0.9035590852646269','labelName': 'publicInfoList','siteId': 35525764,'pageSize': 15,'pageIndex': i, # 每次更改页码索引'action': 'list','fuzzySearch': 'true','fromCode': 'title','keyWords': '年月第周危险化学品安全生产许可证发放情况一览表','sortType': 0,'isDate': 'true','dateFormat': 'yyyy-MM-dd','length': 80,'organId': 9377745,'type': 6,'catIds': '','cId': '','result': '暂无相关信息','file': '/xxgk/publicInfoList_newest2020',}i += 1urls,num = paqu_URL(AH,request_dic)url_list += urls# try:# urls,num = paqu_URL(AH,request_dic)# url_list += urls# except:# print("-#-#-#- 爬取第 {} 页出现错误 -#-#-#-".format(i))print("爬取完成,共 {} 个 URL".format(len(url_list)))return url_listdef paqu_URL(url,data): # 这里更改了data的发送与读取模式URLS = []num = 0headers = {'referer':'http://yjt.hubei.gov.cn/fbjd/xxgkml/xkfw/xzxkgs/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}# html = requests.get(url, headers=headers).contenthtml = requests.post(url, headers=headers, data = json.dumps(data)).contentxml = etree.HTML(html)xpath = '//*[@id="xxgk_lmcon"]/div[1]/ul'txt = xml.xpath(xpath)for ul in txt:for li in ul[:-1]:content = li[0]dic = content.attribURLS.append(dic['href'])num += 1# print("-- {} -- ".format(num),dic['href'])return URLS, numget_all_url(5) # 爬取50页>>>#####第 0 组###########################
>>>#####第 1 组###########################
>>>#####第 2 组###########################
>>>#####第 3 组###########################
>>>#####第 4 组###########################
爬取完成,共 75 个 URL
最后将这几个函数结合在一起就可以完整地爬取这些公司的名称啦
def get_factorys(num):factorys = []urls = get_all_url(num)for url in urls:try:for factory in paqu_AH(url):if factory not in factorys:factorys.append(factory)except:factorys = factorysprint(factorys)print("-#-#- 爬取结束,共爬取得个 {} 公司 -#-#-".format(len(factorys)))return factorys>>>爬取完成,共 75 个 URL
>>>['安徽泉盛化工有限公司', '金寨华润生态农业发展有限公司', '安徽天诚石业有限公司', '安徽马钢矿业资源集团有限公司姑山矿业有限公司和睦山铁矿', '毕克化学(铜陵)有限公司', '艾伦塔斯电气绝缘材料(铜陵)有限公司', '马鞍山市联银乙炔有限责任公司', '安徽三禾化学科技有限公司', '安徽省霍邱县张家夏楼铁矿', '安徽省枞阳县恒源矿业有限责任公司佘家凹铜金矿', '安徽马钢矿业资源集团南山矿业有限公司和尚桥铁矿', '安徽马钢矿业资源集团南山矿业有限公司高村铁矿', '安徽马钢矿业资源集团南山矿业有限公司城门峒尾矿库', '安徽马钢矿业资源集团南山矿业有限公司凹山总尾矿库', '安徽省舒城县新街萤石矿业有限公司', '金丰矿业(安徽)有限公司', '广德晶宇矿业有限公司大梅岭矿区 方解石矿', '安徽金日晟矿业有限责任公司', '泾县银山岭矿业有限公司', '铜陵市虎山磁铁矿有限责任公司', '繁昌县前山矿业有限责任公司', '池州市泰鼎矿业开发有限责任公司 贵池区棠溪乡鸡头山大理岩矿', '池州市桃坡鑫隆矿业开发有限公司尾矿库', '安徽九华金峰矿业股份有限公司池州市来龙山白云石矿', '凤阳县灵山-木屐山矿区玻璃用石英岩矿15号段', '安徽三力矿业有限责任公司灵山石英岩矿', '潜山天柱红石业有限公司官庄镇坛畈村菜坪花岗石矿', '安徽中淮矿业新型建材有限公司', '铜陵茅迪矿业有限公司石灰石矿一矿', '安徽舜泰天成爆破工程有限公司', '马鞍山马钢林德气体有限责任公司', '广德美涂士化工有限公司', '广德来威漆业有限公司', '铜陵化工集团有机化工有限责任公司', '安徽佳田森农药化工有限公司', '安徽久易农业股份有限公司', '池州市六合华丰石子有限公司', '安徽兴欣新材料有限公司', '铜陵华兴精细化工有限公司', '淮北绿洲新材料有限责任公司', '马鞍山神剑新材料有限公司', '安徽禹泰化工有限公司']
>>>-#-#- 爬取结束,共爬取得个 42 公司 -#-#-
最后自白一下,在我爬取的时候可能由于单位时间访问量过大,导致安徽省应急管理厅政务公开的检索部分 “小崩” 了一段时间,大家如果要尝试,尽可能用其他的网站,特别是大厂的、新的网站,他们的带宽比较大,否则惹祸呀呀呀呀呀呀
ah ~ _ ~
Python实践 - 网络爬虫笔记 - 2、从网站上爬取公开信息相关推荐
- Python实践 - 网络爬虫笔记 - 1、对 URL 的 get 请求
Python实践笔记 - 1.高德地图的坐标转换与周边搜索 张板书的Python的实践笔记,包括笔记与DeBug的经历. 为了完成一个比较麻烦的实习任务,尝试着做了这样一个爬虫项目. 实践内容为对一个 ...
- Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...
- python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)
Python网易云爬虫--实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取) 开始动手 打开网易云音乐,找到任意一位歌手的歌曲界面(我们以邓紫棋的<来自天堂的魔鬼>为例). 第一步 ...
- Python顶点小说爬虫(《三寸人间》爬取)
Python顶点小说爬虫(<三寸人间>爬取) 获取整个页面 import requests from bs4 import BeautifulSoup url = "https: ...
- 以下用于数据存储领域的python第三方库是-Python3爬虫学习之MySQL数据库存储爬取的信息详解...
本文实例讲述了Python3爬虫学习之MySQL数据库存储爬取的信息.分享给大家供大家参考,具体如下: 数据库存储爬取的信息(MySQL) 爬取到的数据为了更好地进行分析利用,而之前将爬取得数据存放在 ...
- Python网络爬虫实例——“中国最好大学排名爬取”(嵩天:北理工大学)学习笔记
这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程.写一个博客算是给自己一个激励吧.一起加油.(_ZHJ三月和九月) 完整版代码 import requests from bs4 impor ...
- Python爬虫——简单爬取(从网站上爬取一本小说)
从笔下文学网站爬取一本名为<剑来>的小说,作者为烽火戏诸侯 网站网址如下:https://www.bxwxorg.com/ ①通过查看网页源码找规律(在此之前请弄清楚网站允许爬取的部分,就 ...
- 大众点评 爬虫 java_用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)
很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商 ...
- 【python实现网络爬虫(7)】scrapy爬取笑话大全网站全过程(505问题的解决)
确定要爬取的网站及内容 笑话大全网站中的冷笑话,如下 要采集的字段,有标题,来源.正文内容 创建scrapy项目 步骤一.启动爬虫项目 在某处(比如桌面)创建一个名称为"scrapy爬取笑话 ...
最新文章
- setContentView是如何一步一步被显示出来的?
- SQL Server-聚焦UNIOL ALL/UNION查询(二十三)
- spring中bean的两种注入方式
- bitnami如何使用_使用Bitnami获取完全配置的Apache Airflow Docker开发堆栈
- python3安装常见问题_有关在 Windows 上使用 Python 的常见问题解答
- 在Spring Cloud中集成和使用CSE快速实现商业产品
- AT0 Intrudoction
- python小工具脚本批量处理_压缩文件批量处理(附Python脚本代码)
- 如何恢复录音删除的录音文件_如何把录音转成文字?推荐这款录音转文字app软件!...
- C#中使用ribbon界面
- 人工智能常用的编程语言
- element ul 日期插件
- Gerry。沙漠苦旅。
- PCIE数据采集软件使用
- 智能驾驶全产业链梳理
- html页面回退,HTML5小结
- Asp.Net MVC访问数据库实现登录
- Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7...
- JSFL 批量转化fla脚本文件
- Citrix_XenDesktop 搭建过程
热门文章
- python基于pingouin包进行统计分析:使用mediation_analysis函数构建包含多个中介变量的mediation analysis(中介分析)模型、m参数指定多个中介变量
- 追逐算法之--牛鞭的子弹是怎样练成的(5)--牛鞭终养成
- 一定能解决“糟糕无法安装SQLServer(setup.exe)”问题
- ORICOnbsp;SATA转ESATA挡板真爽,安装…
- Android 保存图片到SQLite,读出SQLite中的图片
- 如何一键删除ppt所有批注
- 在线病毒软件查杀网站 virscan.org
- 【Hexo搭建个人博客】(十)个人博客搭建心得
- OKCC呼叫中心实现“最佳”排班的五项基础
- mm1 matlab,(高质)MM1排队系统仿真matlab实验报告.doc