Python爬虫入门教程 15-100 石家庄政民互动数据爬取
1. 石家庄政民互动数据爬取-写在前面
今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov
的。网址为http://www.sjz.gov.cn/col/1490066682000/index.html
首先声明,为了学习,绝无恶意抓取信息,不管你信不信,数据我没有长期存储,预计存储到重装操作系统就删除。
2. 石家庄政民互动数据爬取-网页分析
点击更多回复 ,可以查看到相应的数据。
数据量很大14万条,,数据爬完,还可以用来学习数据分析,真是nice
经过分析之后,找到了列表页面。
数据的爬取这次我们采用的是 selenium
,解析页面采用lxml
,数据存储采用pymongo
,关于selenium
你可以去搜索引擎搜索相关的教程,好多的,主要就是打开一个浏览器,然后模拟用户的操作,你可以去系统的学习一下。
3. 石家庄政民互动数据爬取-撸代码
导入必备模块
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from lxml import etree
import pymongo
import time
打开浏览器,获取总页码
这个操作最重要的步骤,你搜索之后就会知道,需要提前下载一个叫做 chromedriver.exe 的东东,然后把他配置好,自行解决去吧~
# 加载浏览器引擎,需要提前下载好 chromedriver.exe 。
browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
def get_totle_page():
try:
# 浏览器跳转
browser.get("http://www.sjz.gov.cn/zfxxinfolist.jsp?current=1&wid=1&cid=1259811582187")
# 等待元素加载到
totle_page = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,'input[type="hidden"]:nth-child(4)'))
)
# 获取属性
totle = totle_page.get_attribute('value')
# 获取首页数据,这个地方先不必须
##############################
#get_content()
##############################
return totle
except TimeoutError:
return get_totle_page()
上面的代码在测试之后,你会得到如下结果
这时候,你已经得到20565
这个总页码数目了,只需要进行一系列循环的操作即可,接下来有一个重要的函数,叫做next_page
这个函数里面,需要进行一个模拟用户行为的操作,输入一个页码,然后点击跳转。
def main():
totle = int(get_totle_page()) # 获取完整页码
for i in range(2,totle+1):
print("正在加载第{}页数据".format(i))
# 获取下一页
next_page(i)
if __name__ == '__main__':
print(main())
输入页码,点击跳转
def next_page(page_num):
try:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,"#pageto"))
)
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR,"#goPage"))
)
input.clear() # 清空文本框
input.send_keys(page_num) # 发送页码
submit.click() # 点击跳转
#get_content(page_num)
except TimeoutException:
next_page(page_num)
以上代码实现的效果动态演示为
4. 石家庄政民互动数据爬取-解析页面
可以进行翻页之后,通过browser.page_source
获取网页源码,网页源码通过lxml
进行解析。编写相应的方法为
def get_content(page_num=None):
try:
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "table.tably"))
)
html = browser.page_source # 获取网页源码
tree = etree.HTML(html) # 解析
tables = tree.xpath("//table[@class='tably']")
for table in tables:
name = table.xpath("tbody/tr[1]/td[1]/table/tbody/tr[1]/td")[0].text
public_time = table.xpath("tbody/tr[1]/td[1]/table/tbody/tr[2]/td")[0].text
to_people = table.xpath("tbody/tr[1]/td[1]/table/tbody/tr[3]/td")[0].text
content = table.xpath("tbody/tr[1]/td[2]/table/tbody/tr[1]/td")[0].text
repl_time = table.xpath("tbody/tr[2]/td[1]/table/tbody/tr[1]/td")[0].text
repl_depart = table.xpath("tbody/tr[2]/td[1]/table/tbody/tr[2]/td")[0].text
repl_content = table.xpath("tbody/tr[2]/td[2]/table/tbody/tr[1]/td")[0].text
# 清理数据
consult = {
"name":name.replace("网友:",""),
"public_time":public_time.replace("时间:",""),
"to_people":to_people.replace("留言对象:",""),
"content":content,
"repl_time":repl_time.replace("时间:",""),
"repl_depart":repl_depart.replace("回复部门:",""),
"repl_content":repl_content
}
# 数据存储到mongo里面
#save_mongo(consult)
except Exception: # 这个地方需要特殊说明一下
print("异常错误X1")
print("浏览器休息一下")
time.sleep(60)
browser.get("http://www.sjz.gov.cn/zfxxinfolist.jsp?current={}&wid=1&cid=1259811582187".format(page_num))
get_content()
在实际的爬取过程中发现,经过几百页之后,就会限制一下IP,所以当我们捕获页面信息出错,需要暂停一下,等待页面正常之后,在继续爬取数据。
5. 石家庄政民互动数据爬取-数据存储到mongodb里面
爬取到的最终数据,我存储到了mongodb里面,这个就没有什么难度了,我们按照常规的套路编写即可。
6. 石家庄政民互动数据爬取-写在最后
由于这次爬取的网站是gov
的,所以建议不要用多线程,源码也不发送到github上去了,要不惹祸,如果有任何疑问,请评论。nice boy
她专科学历
27岁从零开始学习c,c++,python编程语言
29岁编写百例教程
30岁掌握10种编程语言,
用自学的经历告诉你,学编程就找梦想橡皮擦

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java中ArrayList学习笔记
Java中ArrayList学习笔记 先看两段代码 这段代码在执行的时候会报 但是这样写就好着呢: 总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个方法,这个方法里面判断modCount和expectedModCount不相等的时候就抛出ConcurrentModificationException这个异常。 原因:当for循环执行的时候首先调用了 这个方法,这个方法初始化了expectedModCount=modCount,modCount的值是在add方法里面复制的,如当前程序为8,初始化给expectedModCount的值。当调用remove 方法的时候,将modCount++; 导致下一次循环的时候两个值不相同,就会报这个错误。 这里还有个知识点: modCount 这个变量被transient关键字修饰,意思是不可被序列化。 参考文档:https://www.cnblogs.com/chenpi/p/6185773.html 解决办法: for (int i = students.size(...
-
下一篇
c#位运算基本概念与计算过程
c#位运算基本概念与计算过程前言一些非常基础的东西,在实际工作中没有用到、很少用到。一旦遇到,又不知所云。最近遇到一个问题,把一个int16(short) 、两个bool变量整合成一个int32(int),当听到这个要求时,我第一反应是不是需求弄错了,后来才发现是自己才疏学浅,这里就需要位运算相关的概念。这里补充一下这几个基本概念位、字节、字符(英文字母)、汉字、KB、MB、GB、TB的关系1.位:bit,也叫比特位,是计算机表示数据最小的单位,用二进制0和1来存储2.字节:byte,1byte(1B)=8b,一个字节=8位3.字符:char,1char=2byte=16b,1个字符=2个字节=16位4.KB,1KB=1024byte(1024B)5.MB,1MB=1014KB6.GB,1GB=1024MB7TB,1TB=1024GB一个汉字占两个字节,也就是32位,一篇1000字的文章,大概就是321000 的二进制0或1 。一个10M的短视频,也就是10M=1024KB10=1024字节1010=1024b1010*8大概就是919200个二进制的0和1了short 是16位,in...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- 面试大杂烩
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池