正所谓,民生无小事,今日多关注,今天我们利用多线程来爬取阳光问政,关注一下老百姓需要解决什么问题。

目录

线程

什么是线程

线程创建

编写执行程序

创建线程类

run()方法

开启、等待线程

爬前分析

实战演练

单线程爬虫

获取详情网页url

获取详情网页数据

保存数据

启动程序

多线程爬虫


线程

什么是线程

线程是轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。

其生命周期可以分为五个状态——新建、就绪、运行、阻塞、终止,如下图所示:

  • 新建状态:新创建的线程在调用 start() 方法之前,不会得到执行;

  • 就绪状态:新建状态的线程调用 start() 方法后,该线程就转换到就绪状态,当获取到CPU资源就可以执行;

  • 运行状态:就绪状态的线程得到了 CPU资源,并开始执行 target 参数执行的目标函数或者 run() 方法;

  • 阻塞状态:当 CPU 对多个线程进行调度时,对于获得 CPU 调度却没有执行完毕的线程,该线程就进入阻塞状态;

  • 终止状态:线程执行结束、发生异常(Exception)或错误(Error),线程就会进入终止状态。

线程创建

创建线程可以分为五步:编写执行程序、创建线程类、在线程类run方法中调用要执行的程序、开启线程和等待线程结束。

编写执行程序

import time
def print_time(threadName):for i in range(5):time.sleep(0.5)timestamp = time.time()date = time.localtime(timestamp)Now_date = time.strftime('%Y-%m-%d %H:%M:%S', date)print ("%s: %s" % (threadName, Now_date))

在执行程序中,我们通过time来获取当前系统时间,由于程序执行速度是很快的,所以我们通过time.sleep()方法让程序休眠0.5秒,这样我们就可以看到线程的交替执行。

创建线程类

import threading
class myThread (threading.Thread):def __init__(self, name):super(myThread,self).__init__()self.name = namedef run(self):pass

首先导入线程模块threading,创建myThread()线程类并通过threading.Thread来继承线程属性,调用super()方法并初始化name变量。

run()方法

def run(self):print ("开始线程:" + self.name)print_time(self.name)print ("退出线程:" + self.name)

在run方法中,我们通过调用print_time()方法并传入self.name参数来执行第一步编写的执行程序。

开启、等待线程

线程类和执行程序都写好了,接下来开启线程并等待线程结束,具体代码如下所示:

thread1 = myThread("Thread-1")
thread2 = myThread("Thread-2")
​
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主线程")

这里我们创建了两个线程,首先通过实例化线程类myThread()并传入线程名,调用start()方法使线程处于就绪状态,再调用join()方法等待线程结束。

运行结果如下所示:

爬前分析

首先进入阳光问政最新问政网页并打开开发者模式,如下图所示:

这个网站比较简单,网页的URL链接最后一个数字就是它的页码,所以我们构造url链接时,可以这样:

for i in range(1,6):url=f'http://wzzdg.sun0769.com/political/index/politicsNewest?id=1&page={i}'

这样就可以获取多页数据了,在源代码中也有我们想要的详情网页url链接,其存放在上图的右边红框中。

随机打开一个问政问题并打开开发者模式,如下图所示:

可以发现该url为建议909路延长至东莞南站高铁站作为总站-阳光热线问政平台,对比上上图的详情网页url,只需要在获取到的url链接前面添加http://wzzdg.sun0769即可。

详情网页也很简单,我们想要的数据在源代码中也有,所以我们待会只要获取URL链接页面的源代码即可获取到所有数据。

实战演练

在实战演练中,我们首先通过编写单线程爬虫来爬取阳光问政的数据,再通过多线程程序执行单线程爬虫。

单线程爬虫

获取详情网页url

首先获取详情网页的url链接,主要代码如下所示:

import requests
import parsel
import pymysql
def get_link():for i in range(1,6):url=f'http://wzzdg.sun0769.com/political/index/politicsNewest?id=1&page={i}'response=requests.get(url,headers=headers)Xapth=parsel.Selector(response.text)f = open('url.txt', 'a', encoding='utf-8')ul_list = Xapth.xpath('//html/body/div[2]/div[3]/ul[2]/li')for li in ul_list:url_href='https://wzzdg.sun0769.com/'+li.xpath('./span[3]/a/@href').extract_first()f.write(url_href)f.write('\n')get_data(url_href)

我们一共获取5页数据,每页数据有15条详情网页的URL链接,通过requests.get()方法发出网络请求,并通过parsel.Selector()方法来解析响应的文本数据,最后将获取到的url链接传入到自定义get_data()方法。

注意:这里我们把url链接保存在一个txt文本中,方便我们在多线程里使用所有详情网页的url链接。

获取详情网页数据

获取详情网页的url后,接下来就获取其内容了,具体代码如下所示:

def get_data(i):response=requests.get(i,headers=headers)Xapth=parsel.Selector(response.text)data={}data['number_id']=Xapth.xpath('/html/body/div[3]/div[2]/div[2]/div[1]/span[4]/text()').extract_first().replace('编号:','')data['state_now']=Xapth.xpath('/html/body/div[3]/div[2]/div[2]/div[1]/span[3]/text()').extract_first().replace('状态:','').strip()data['PoliticalTitle']=Xapth.xpath('/html/body/div[3]/div[2]/div[2]/p/text()').extract_first()data['PoliticalTime']=Xapth.xpath('/html/body/div[3]/div[2]/div[2]/div[1]/span[2]/text()').extract_first().replace('发布日期','')data['url_href']=idata['text']=Xapth.xpath('/html/body/div[3]/div[2]/div[2]/div[2]/pre/text()').extract_first().replace('\n','').replace('\r','')saving_scenery_data(list(data.values()))

获取详情网页的数据和获取url链接代码差不多,这里我就不一一解释了,最后我们把数据传递到自定义方法saving_sunshine_data()中。

保存数据

这次数据我们保存在MySQL数据库中,主要代码如下图所示:

def saving_scenery_data(srr):db = pymysql.connect(host=host, user=user, password=passwd, port=port, db='Politics')cursor = db.cursor()sql = 'insert into problem_data(number_id, state_now, PoliticalTitle, PoliticalTime, url_href,text) values(%s,%s,%s,%s,%s,%s)'try:cursor.execute(sql,srr)db.commit()except:db.rollback()db.close()

首先连接数据库,通过cursor()方法获取游标,再通过.execute()方法执行单条的sql语句,执行成功后返回受影响的行数,然后关闭数据库连接。当保存的数据不成功,就调用rollback()方法,撤消当前事务中所做的所有更改,并释放此连接对象当前使用的任何数据库锁。

启动程序

好了,主要代码已经写好了,接下来编写启动程序的代码,主要代码如下图所示:

if __name__ == '__main__':t1=time.time()get_link()t2=time.time()print(t2-t1)

这里我们通过time.time()方法来获取爬虫程序的执行时间。

运行结果如下图所示:

从结果来看,单线程爬取数据用了16秒,接下来编写多线程来爬取数据。

多线程爬虫

刚才单线程爬虫的文件名为yangguang.py,可以直接调用单线程爬虫方法来编写多线程爬虫,首先创建多线程爬虫类,主要代码如下所示:

import yangguang
import threading
import time
f=open('url.txt',mode='r')
class mythread(threading.Thread):def __init__(self,f):super(mythread,self).__init__()self.f=fdef run(self)->None:for i in self.f:yangguang.get_data(i)

首先导入单线程爬虫yangguang.py文件,打开刚才单线程爬虫保存的txt文件,再创建mythread()类并初始化线程类,重写run()方法,通过for循环把txt文件中的url读取并传递在单线程爬虫yangguang.get_data()方法中。

好了,多线程类写好了,接下来编写执行代码,主要代码如下所示:

if __name__ == '__main__':t1=time.time()yangguang.create_db()threads = [mythread(f) for i in range(10)]for thread in threads:thread.start()for thread in threads:thread.join()t2=time.time()print(t2-t1)

这里我们创建了10个线程,运行结果如下所示:

开启十个线程来爬取数据,一共用了2.4秒,大大提高了爬虫效率。

好了,多线程爬取阳光问政就讲到这里了,感谢观看!!!

Python爬虫——多线程爬取阳光问政相关推荐

  1. python爬虫 多线程 爬取网站排行榜上的所有小说

    python爬虫,多线程批量爬取多部小说 欢迎阅读 环境 获取排行榜top上的所有小说地址 分析排行榜top100页面的html,获取所有小说的url 遍历小说列表url到生成txt 多线程启动爬取任 ...

  2. Python 爬虫多线程爬取美女图片保存到本地

    Wanning 我们不是生产者,我们只是搬运工 资源来至于qiubaichengren ,代码基于Python 3.5.2 友情提醒:血气方刚的骚年.请 谨慎 阅图 !!! 谨慎 阅图 !!! 谨慎 ...

  3. python爬虫能爬取微信密码吗_爬虫如何爬取微信公众号文章

    下篇文章:python爬虫如何爬取微信公众号文章(二) 下下篇连接python爬虫如何实现每天爬取微信公众号的推送文章 因为最近在法院实习,需要一些公众号的数据,然后做成网页展示出来便于查看,之前我倒 ...

  4. Python爬虫之爬取淘女郎照片示例详解

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  5. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址

    随着人们生活水平的提高,肯德基这类的快餐消费的十分火爆,成为小朋友和年轻人的最爱,我们到一个地方想要找到肯德基店面,会根据导航获取肯德基地址,那你知道我们也可以使用python爬虫获取KFC地址吗?我 ...

  6. python爬取网页表格数据匹配,python爬虫——数据爬取和具体解析

    标签:pattern   div   mat   txt   保存   关于   json   result   with open 关于正则表达式的更多用法,可参考链接:https://blog.c ...

  7. Python爬虫:爬取instagram,破解js加密参数

    Python爬虫:爬取instagram,破解js加密参数 instagram 是国外非常流行的一款社交网站,类似的还有像facebook.twitter,这些社交网站对于掌握时事热点.电商数据来源和 ...

  8. python爬取豆瓣电影top250_用Python爬虫实现爬取豆瓣电影Top250

    用Python爬虫实现爬取豆瓣电影Top250 #爬取 豆瓣电影Top250 #250个电影 ,分为10个页显示,1页有25个电影 import urllib.request from bs4 imp ...

  9. python爬取b站视频封面_学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面...

    学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面 import os import requests import re import json from bs4 import B ...

  10. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

最新文章

  1. 【Nodejs篇一】Node js 简介
  2. 从github克隆内容到本地时权限问题
  3. 《需求分析与系统设计》第三篇
  4. Android程序中读取使用已有的SQLite数据库
  5. sql server 快照_SQL Server复制:配置快照和事务复制
  6. 百度成立互联网医院;钉钉招小学生产品体验师;iOS 13.4 上线 | 极客头条
  7. keil系列 魔法棒(目标选项)配置、编译工具ARMCC
  8. 曲线运动与万有引力公式_高中物理公式大全!
  9. macbook硬盘读写速度测试(Disk Speed Test 测速贴图)
  10. 反射之前奏Oracle升级版
  11. USYD悉尼大学DATA 2002 【R语言学习1】【介绍R】Introduction to R「虽迟但到」
  12. centos 下载文件很慢_百度云盘上传文件和下载文件慢的解决办法
  13. Excel 有哪些可能需要熟练掌握而很多人不会的技能2
  14. Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)
  15. java服务和net服务_艾伟_转载:Java和.NET互操作:我们应该放弃Web Service吗?
  16. 盘点 | AAAI2020中的四篇推荐系统好文
  17. u盘计算机无法找到该项目,在电脑中删除文件时提示“找不到该项目”怎么办?...
  18. AirPods站起来,千万个Hi-Fi倒下去
  19. 如何保障企业网络安全
  20. 浅谈 pipeline

热门文章

  1. 小米微信双开开启谷歌服务器,小米10怎么双开微信 具体设置方法分享
  2. 小白学PCB(一):画一块LM2596降压板,稳定输出5V(选择什么软件画,如何打板)
  3. 关于PG与Linux的HUGEPAGE/HUGETLBFS
  4. 计算机二级excel常见函数函数多表求和,excel sumif函数多条件求和 sumif的高级用法:跨多表条件求和...
  5. vue图片压缩与批量上传
  6. Deepin 20版 安装教程(Vmware)
  7. DNW5.0 USB 不OK
  8. android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...
  9. 科大讯飞语音合成WebApi
  10. Cityscapes数据集介绍