爬虫_古诗文网(队列,多线程,锁,正则,xpath)
import requests
from queue import Queue
import threading
from lxml import etree
import re
import csv class Producer(threading.Thread):
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}
def __init__(self, page_queue, poem_queue, *args, **kwargs):
super(Producer, self).__init__(*args, **kwargs)
self.page_queue = page_queue
self.poem_queue = poem_queue def run(self):
while True:
if self.page_queue.empty():
break
url = self.page_queue.get()
self.parse_html(url) def parse_html(self, url):
# poems = []
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}
response = requests.get(url, headers=headers)
response.raise_for_status()
html = response.text
html_element = etree.HTML(html)
titles = html_element.xpath('//div[@class="cont"]//b/text()')
contents = html_element.xpath('//div[@class="contson"]')
hrefs = html_element.xpath('//div[@class="cont"]/p[1]/a/@href')
for index, content in enumerate(contents):
title = titles[index]
content = etree.tostring(content, encoding='utf-8').decode('utf-8')
content = re.sub(r'<.*?>|\n|', '', content)
content = re.sub(r'\u3000\u3000', '', content)
content = content.strip()
href = hrefs[index]
self.poem_queue.put((title, content, href)) class Consumer(threading.Thread): def __init__(self, poem_queue, writer, gLock, *args, **kwargs):
super(Consumer, self).__init__(*args, **kwargs)
self.writer = writer
self.poem_queue = poem_queue
self.lock = gLock def run(self):
while True:
try:
title, content, href = self.poem_queue.get(timeout=20)
self.lock.acquire()
self.writer.writerow((title, content, href))
self.lock.release()
except:
break def main():
page_queue = Queue(100)
poem_queue = Queue(500)
gLock = threading.Lock()
fp = open('poem.csv', 'a',newline='', encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('title', 'content', 'href')) for x in range(1, 100):
url = 'https://www.gushiwen.org/shiwen/default.aspx?page=%d&type=0&id=0' % x
page_queue.put(url) for x in range(5):
t = Producer(page_queue, poem_queue)
t.start() for x in range(5):
t = Consumer(poem_queue, writer, gLock)
t.start() if __name__ == '__main__':
main()
运行结果

爬虫_古诗文网(队列,多线程,锁,正则,xpath)的更多相关文章
- 爬虫_中国天气网_文字天气预报(xpath)
import requests from lxml import etree headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/5 ...
- requests_cookie登陆古诗文网。session的使用
通过登录失败,快速找到登录接口 获取hidden隐藏域中的id的value值 # 通过登陆 然后进入到主页面 # 通过找登陆接口我们发现 登陆的时候需要的参数很多 # _VIEWSTATE: /m1O ...
- 爬虫_豆瓣全部正在热映电影 (xpath)
单纯地练习一下xpath import requests from lxml import etree def get_url(url): html = requests.get(url) retur ...
- Python爬虫入门教程 11-100 行行网电子书多线程爬取
行行网电子书多线程爬取-写在前面 最近想找几本电子书看看,就翻啊翻,然后呢,找到了一个 叫做 周读的网站 ,网站特别好,简单清爽,书籍很多,而且打开都是百度网盘可以直接下载,更新速度也还可以,于是乎, ...
- 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据
通过requests.re(正则表达式) 爬取"古诗文"网页数据. 详细代码如下: #!/user/bin env python # author:Simple-Sir # tim ...
- Java多线程--锁的优化
Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时间,如果有多个线程都在等待该资源,整体性能必然下降.所有有必要减少单个线程持有锁的时间 ...
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...
- Python爬虫爬取全书网小说,程序源码+程序详细分析
Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...
- SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色【正品 价格 图片 折扣 评论】_尚品网ShangPin.com
SANSA 上上洛可可 贾伟作品 高山流水 香炉 香插香台香具 高端商务礼品 黑色[正品 价格 图片 折扣 评论]_尚品网ShangPin.com
随机推荐
- H5 类选择器
10-类选择器 错误的写法: --> 迟到毁一生 早退穷三代 按时上下班 必成高富帅 我是段落 我是段落 <!DOCTYPE html> <html lang="en ...
- Oja’s rule
目录 Oja's rule 背景 Hebbian learning 主要的一些理论 论文里面一些主要的假设 引理1 引理2 引理3 定理1 LEMMA 3(ALL) 引理 4 定理 2 定理 3(关于 ...
- matplotlib 入门之Image tutorial
文章目录 载入图像为ndarray 显示图像 调取各个维度 利用cmp 获得像素点的RGB的统计 通过clim来限定rgb 标度在下方 插值,马赛克,虚化 matplotlib教程学习笔记 impor ...
- IBM的淘汰之路
BM曾经在计算领域独领风骚,但是90年被PC产业链上的微软.英特尔等厂商围殴,遭遇最严重的危机; 今天在云计算市场,IBM曾在遭遇同样的危机,这一次不知道它能否安然度过; IBM收购红帽转向混合云,是 ...
- h5-语义化标签
###1.语义化标签 在h5之前,在开发过程中大量div的id名称重复,例如div id="footer"来标记页脚内容,所以html5元素引入了语义化标签(一组新的片段类元素) ...
- cpp11_thread线程
一.进程与线程 cpu一般有m核n线程的说法,那么该cpu只能同时运行n个线程(线程中没有sleep). #include <thread> #include <mutex> ...
- npm的nrm命令使用--设置镜像地址
npm下载会很慢,因为npm默认从国外下载资源,建议修改npm镜像源地址 1.运行npm i nrm -g全局安装nrm包: 2.使用nrm ls查看当前所有可用的镜像源地址以及当前所使用的镜像源地址 ...
- day 7-18 mysql case when语句
概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...
- php5.6.x到php7.0.x特性
php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Clas ...
- Django--CRM--modelformset的用法
一 . modelformset用法 其实和modelform方法差不多,只不过是显示的时候可以直接修改,显示的select的那种模式 from django.forms import modelfo ...