Python爬虫入门教程 9-100 河北阳光理政投诉板块
河北阳光理政投诉板块-写在前面
之前几篇文章都是在写图片相关的爬虫,今天写个留言板爬出,为另一套数据分析案例的教程做做准备,作为一个河北人,遵纪守法,有事投诉是必备的技能,那么咱看看我们大河北人都因为什么投诉过呢?
今天要爬取的网站地址 http://yglz.tousu.hebnews.cn/l-1001-5-
,一遍爬取一遍嘀咕,别因为爬这个网站在去喝茶,再次声明,学习目的,切勿把人家网站爬瘫痪了。
河北阳光理政投诉板块-开始撸代码
今天再次尝试使用一个新的模块 lxml
,它可以配合xpath
快速解析HTML文档,官网网站 https://lxml.de/index.html
利用pip安装lxml,如果安装失败,可以在搜索引擎多搜搜,内容很多,100%有解决方案。
pip install lxml
废话不多说,直接通过requests
模块获取百度首页,然后用lxml
进行解析
import requests
from lxml import etree # 从lxml中导入etree
response = requests.get("http://www.baidu.com")
html = response.content.decode("utf-8")
tree=etree.HTML(html) # 解析html
print(tree)
当你打印的内容为下图所示,你就接近成功了!
下面就是 配合xpath
语法获取网页元素了,关于xpath
这个你也可以自行去学习,非常简单,搜索一下全都是资料,咱就不讲了。
通过xpath
我们进行下一步的操作,代码注释可以多看一下。
tree=etree.HTML(html) # 解析html
hrefs = tree.xpath('//a') #通过xpath获取所有的a元素
# 注意网页中有很多的a标签,所以获取到的是一个数组,那么我们需要用循环进行操作
for href in hrefs:
print(href)
打印结果如下
<Element a at 0x1cf64252408>
<Element a at 0x1cf642523c8>
<Element a at 0x1cf64252288>
<Element a at 0x1cf64252308>
<Element a at 0x1cf64285708>
<Element a at 0x1cf642aa108>
<Element a at 0x1cf642aa0c8>
<Element a at 0x1cf642aa148>
<Element a at 0x1cf642aa048>
<Element a at 0x1cf64285848>
<Element a at 0x1cf642aa188>
在使用xpath
配合lxml
中,记住只要输出上述内容,就代表获取到东西了,当然这个不一定是你需要的,不过代码至少是没有错误的。
继续编写代码
# 注意网页中有很多的a标签,所以获取到的是一个数组,那么我们需要用循环进行操作
for href in hrefs:
print(href)
print(href.get("href")) # 获取html元素属性
print(href.text) # 获取a标签内部文字
输出结果
<Element a at 0x1c7b76c2408>
http://news.baidu.com
新闻
<Element a at 0x1c7b76c23c8>
http://www.hao123.com
hao123
<Element a at 0x1c7b76c2288>
http://map.baidu.com
地图
<Element a at 0x1c7b76c2308>
http://v.baidu.com
视频
<Element a at 0x1c7b76f5708>
http://tieba.baidu.com
贴吧
现在你已经看到,我们已经获取到了百度首页的所有a标签,并且获取到了a标签的href属性和a标签的文字。有这些内容,你就能很容易的去获取我们的目标网站了。
河北阳光理政投诉板块-爬取投诉数据
找到我们的目标网页,结果发现,出事情了,页面竟然是用aspx动态生成的,技术你就不需要研究了,总之,碰到了一个比较小的问题。
首先,点击下一页的时候,页面是局部刷新的
刷新的同时,捕获了一下发送的请求,是post
方式,这个需要留意一下,最要紧的是下面第2张图片和第3张图片。
这张图片中的viewstate
这张图片也有一些奇怪的参数
这些参数都是典型的动态网页参数。
解决这个问题,还要从源头抓起!
打开我们要爬取的首页http://yglz.tousu.hebnews.cn/l-1001-5-
第1点需要确定,post的地址经过分析就是这个页面。
所以这段代码是必备的了,注意下面的post
response = requests.post("http://yglz.tousu.hebnews.cn/l-1001-5-")
html = response.content.decode("utf-8")
右键查看源码之后,发现源码中有一些比较重要的隐藏域
里面获取就是我们要的必备信息
没错,这些内容,我们想办法获取到就可以了
基本步骤
- 获取源码
- lxml通过xpath解析隐藏域,取值
import requests
from lxml import etree # 从lxml中导入etree
try:
response = requests.post("http://yglz.tousu.hebnews.cn/l-1001-5-")
html = response.content.decode("utf-8")
except Exception as e:
print(e)
tree=etree.HTML(html) # 解析html
hids = tree.xpath('//input[@type="hidden"]') # 获取隐藏域
# 声明一个字典,用来存储后面的数据
common_param = {}
# 循环取值
for ipt in hids:
common_param.update({ipt.get("name"):ipt.get("value")}) # 这个地方可以分开写,应该会很清楚,我就不写了,总之,就是把上面获取到的隐藏域的name属性和value属性都获取到了
上面的代码写完之后,其实已经完成了,非常核心的内容了,后面就是继续爬取了
我们按照post
要的参数补充完整其他的参数即可
import requests
from lxml import etree # 从lxml中导入etree
try:
response = requests.post("http://yglz.tousu.hebnews.cn/l-1001-5-")
html = response.content.decode("utf-8")
except Exception as e:
print(e)
tree=etree.HTML(html) # 解析html
hids = tree.xpath('//input[@type="hidden"]')
common_param = {}
for ipt in hids:
common_param.update({ipt.get("name"):ipt.get("value")})
##############################################################
for i in range(1,691):
common_param.update({"__CALLBACKPARAM":f"Load|*|{i}", # 注意这个地方,由于我直接看到了总共有690页数据,所以直接写死了循环次数
"__CALLBACKID": "__Page",
"__EVENTTARGET":"",
"__EVENTARGUMENT":""})
到这一步,就可以抓取真实的数据了,我在下面的代码中最关键的一些地方加上注释,希望你能看懂
for i in range(1,691):
common_param.update({"__CALLBACKPARAM":f"Load|*|{i}",
"__CALLBACKID": "__Page",
"__EVENTTARGET":"",
"__EVENTARGUMENT":""})
response = requests.post("http://yglz.tousu.hebnews.cn/l-1001-5-",data=common_param,headers=headers)
html = response.content.decode("utf-8")
print("*"*200)
tree = etree.HTML(html) # 解析html
divs = tree.xpath('//div[@class="listcon"]') # 解析列表区域div
for div in divs: # 循环这个区域
try:
# 注意下面是通过div去进行的xpath查找,同时加上try方式报错
shouli = div.xpath('span[1]/p/a/text()')[0] # 受理单位
type = div.xpath('span[2]/p/text()')[0].replace("\n","") # 投诉类型
content = div.xpath('span[3]/p/a/text()')[0] # 投诉内容
datetime = div.xpath('span[4]/p/text()')[0].replace("\n","") # 时间
status = div.xpath('span[6]/p/text()')[0].replace("\n","") # 时间
one_data = {"shouli":shouli,
"type":type,
"content":content,
"datetime":datetime,
"status":status,
}
print(one_data) # 打印数据,方便存储到mongodb里面
except Exception as e:
print("内部数据报错")
print(div)
continue
代码完成,非常爽
最后抓取到了 13765
条数据,官方在我抓取的时候是13790,差了25条数据,没有大的影响~
数据我都存储在了 mongodb里面,关于这个如何使用,请去看我以前的代码吧~~~~
这些数据,放着以后做数据分析用了。
https://github.com/wangdezhen/yangguangwenzheng
Python爬虫入门教程 9-100 河北阳光理政投诉板块的更多相关文章
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...
- Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分
1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...
- Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy
爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...
- Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy
爬前叨叨 2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我 ...
- Python爬虫入门教程 2-100 妹子图网站爬取
妹子图网站爬取---前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们 ...
- Python爬虫入门教程 1-100 CentOS环境安装
简介 你好,当你打开这个文档的时候,我知道,你想要的是什么! Python爬虫,如何快速的学会Python爬虫,是你最期待的事情,可是这个事情应该没有想象中的那么容易,况且你的编程底子还不一定好,这套 ...
- Python爬虫入门教程 20-100 慕课网免费课程抓取
写在前面 美好的一天又开始了,今天咱继续爬取IT在线教育类网站,慕课网,这个平台的数据量并不是很多,所以爬取起来还是比较简单的 准备爬取 打开我们要爬取的页面,寻找分页点和查看是否是异步加载的数据. ...
- Python爬虫入门教程 5-100 27270图片爬取
27270图片----获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位, ...
- Python爬虫入门教程 60-100 python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干
常见验证码 之前的博客中已经解决了一些常见验证码的问题,但是验证码是层出不穷的,目前解决验证码除了通过常规手段解决以外,还可以通过人工智能领域的深度学习去解决 深度学习?! 无疑对爬虫coder提高了 ...
随机推荐
- pygame学习之绘制圆
import pygame from pygame.locals import * pygame.init() screen = pygame.display.set_mode((600, 500)) ...
- webstorm调试
webstorm调试nodejs https://www.cnblogs.com/dogharry/p/4335157.html webstorm调试js https://www.cnblo ...
- ImCash:币圈英文术语大全
近年来随着数字货币的火热,在全世界范围内涌现出了一群数字货币的“发烧友”和忠实投资者,他们形成了自己的圈子“币圈”,并且有了自己的文化和语言,今天就让我们一起来了解一下外国币圈有哪些有意思的英文“专用 ...
- Numpy 基础运算2
# -*- encoding:utf-8 -*- # Copyright (c) 2015 Shiye Inc. # All rights reserved. # # Author: ldq < ...
- TimesTen中文乱码问题(其实是cmd.exe中文乱码)
解决了导入数据的问题后,从导师那儿拷贝了一些样例数据,结果发现cmd.exe中文乱码(开始我以为是TimesTen无法显示中文).在网上搜了很多,因为我以为是TimesTen无法显示中文,所以都是搜的 ...
- MORE XOR
MORE XOR #include<bits/stdc++.h> using namespace std; ; int a[maxn]; ][maxn]; int main() { ios ...
- 2.9 linux学习(1)
2019-2-9 16:07:44 学一下Linux,多学一点东西 新认识个老师,超哥 很牛逼感觉! https://www.cnblogs.com/pyyu/p/9276851.html 这是入门参 ...
- Django ORM 知识概要
相关命令 python3 manage.py makemigrations 根据模型生成相关迁移文件 python3 manage.py migrate 根据迁移文件,将表结构更新到数据库中,并在Dj ...
- 微信测试号开发入门配置问题java
这个测试号配置弄了好几天了,入了无数坑,终于解决了...辛苦我了,手动安慰一下自己.. 为了萌新们以后不要再浪费时间绕半天做无用功.看看楼楼的艰苦历程吧. 此教程针对没有云服务器,没有自己的域名的.没 ...
- 【数据结构】红黑树与跳表-(SortSet)-(TreeMap)-(TreeSet)
SortSet 有序的Set,其实在Java中TreeSet是SortSet的唯一实现类,内部通过TreeMap实现的:而TreeMap是通过红黑树实现的:而在Redis中是通过跳表实现的: Skip ...