爬虫_古诗文网(队列,多线程,锁,正则,xpath)

 1 import requests
 2 from queue import Queue
 3 import threading
 4 from lxml import etree
 5 import re
 6 import csv
 7
 8
 9 class Producer(threading.Thread):
10     headers = {‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36‘}
11     def __init__(self, page_queue, poem_queue, *args, **kwargs):
12         super(Producer, self).__init__(*args, **kwargs)
13         self.page_queue = page_queue
14         self.poem_queue = poem_queue
15
16
17     def run(self):
18         while True:
19             if self.page_queue.empty():
20                 break
21             url = self.page_queue.get()
22             self.parse_html(url)
23
24
25     def parse_html(self, url):
26         # poems = []
27         headers = {‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36‘}
28         response = requests.get(url, headers=headers)
29         response.raise_for_status()
30         html = response.text
31         html_element = etree.HTML(html)
32         titles = html_element.xpath(‘//div[@class="cont"]//b/text()‘)
33         contents = html_element.xpath(‘//div[@class="contson"]‘)
34         hrefs = html_element.xpath(‘//div[@class="cont"]/p[1]/a/@href‘)
35         for index, content in enumerate(contents):
36             title = titles[index]
37             content = etree.tostring(content, encoding=‘utf-8‘).decode(‘utf-8‘)
38             content = re.sub(r‘<.*?>|\n|‘, ‘‘, content)
39             content = re.sub(r‘\u3000\u3000‘, ‘‘, content)
40             content = content.strip()
41             href = hrefs[index]
42             self.poem_queue.put((title, content, href))
43
44
45 class Consumer(threading.Thread):
46
47     def __init__(self, poem_queue, writer, gLock, *args, **kwargs):
48         super(Consumer, self).__init__(*args, **kwargs)
49         self.writer = writer
50         self.poem_queue = poem_queue
51         self.lock = gLock
52
53     def run(self):
54         while True:
55             try:
56                 title, content, href = self.poem_queue.get(timeout=20)
57                 self.lock.acquire()
58                 self.writer.writerow((title, content, href))
59                 self.lock.release()
60             except:
61                 break
62
63
64 def main():
65     page_queue = Queue(100)
66     poem_queue = Queue(500)
67     gLock = threading.Lock()
68     fp = open(‘poem.csv‘, ‘a‘,newline=‘‘, encoding=‘utf-8‘)
69     writer = csv.writer(fp)
70     writer.writerow((‘title‘, ‘content‘, ‘href‘))
71
72
73     for x in range(1, 100):
74         url = ‘https://www.gushiwen.org/shiwen/default.aspx?page=%d&type=0&id=0‘ % x
75         page_queue.put(url)
76
77     for x in range(5):
78         t = Producer(page_queue, poem_queue)
79         t.start()
80
81     for x in range(5):
82         t = Consumer(poem_queue, writer, gLock)
83         t.start()
84
85 if __name__ == ‘__main__‘:
86     main()

运行结果

原文地址:https://www.cnblogs.com/MC-Curry/p/9460507.html

时间: 2024-10-11 05:29:44

爬虫_古诗文网(队列,多线程,锁,正则,xpath)的相关文章

云打码 古诗文网

# 云打码  代码示例 import http.client, mimetypes, urllib, json, time, requests class YDMHttp: apiurl = 'http://api.yundama.com/api.php' username = '' password = '' appid = '' appkey = '' def __init__(self, username, password, appid, appkey): #构造方法 self.user

爬取古诗文网古诗词

#python3.6 #爬取古诗文网的诗文 import requests from bs4 import BeautifulSoup import html5lib import re import os def content(soup): b = 1 poetrydict = dict() for i in soup.find_all('a')[8:]: if i.get('href'): url = '%s%s' % ("https://so.gushiwen.org/",i.

爬虫_豆瓣全部正在热映电影 (xpath)

单纯地练习一下xpath 1 import requests 2 from lxml import etree 3 4 5 def get_url(url): 6 html = requests.get(url) 7 return html.text 8 9 10 def parse_html(html): 11 informations = [] 12 html_element = etree.HTML(html) 13 ul = html_element.xpath('//ul[@class

古诗文网站的网络爬虫编写方式,通过网络爬虫抓去内容

1. 以下就是古诗文网站的爬虫代码,请看: # encoding:utf-8 import requests import re import json     def parse_page(url):     # 1.请求网站     headers = {         "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为如下部分: 第一部分:synchronized与static synchronized 的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:Java多线程锁,源代码剖析 第一部分:synchronized与static synchronized的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是"类

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

Python多线程锁

[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一说. 1.给线程加锁的原因     我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这个进程的内存空间中的数据的,比如多个线程可以同时调用某一... 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一

Window下高性能IOCP模型队列多线程下应用

IOCP,先从概念上认识一下.IOCP全称I/O Completion Port,中文译为I/O完成端口.是Windows平台最高效的I/O模块,现在IIS服务器,就采用IOCP模型.IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序.与使用select()或是其它异步方法不同的是,现在很多书,文字都直接将IOCP模块和网络编程关联起来,好像IOCP就是和网络打交道的.典型的IOCP模型的使用,是 将一个套接字(socket)与一个完成端口关联了起来,当一个网络事件发生的时