Python 之糗事百科多线程爬虫案例
import requests
from lxml import etree
import json
import threading
import queue # 采集html类
class GetHtml(threading.Thread):
def __init__(self, page_queue):
threading.Thread.__init__(self)
self.page_queue = page_queue def run(self):
self.do_get_html() def do_get_html(self):
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0"}
global data_queue
while True:
if self.page_queue.empty():
break
page = self.page_queue.get()
url = "https://www.qiushibaike.com/8hr/page/%s/" % str(page)
timeout = 5
while timeout > 0:
try:
_response = requests.get(url, headers=headers)
html = _response.content
# 保存到待解析队列
data_queue.put(html)
break
except ConnectionError as e:
print(e)
timeout -= 1
if timeout < 0:
print("time out, url: " + url) class ParseHtml(threading.Thread):
def __init__(self):
threading.Thread.__init__(self) def run(self):
self.do_parse_data() def do_parse_data(self):
global total, f
while True:
if data_queue.empty():
break
try:
html = data_queue.get()
text = etree.HTML(html)
list_node = text.xpath("//li[contains(@id, 'qiushi_tag_')]")
for node in list_node:
username = node.xpath(".//a[@class='recmd-user']/img/@alt")[0]
user_img = node.xpath(".//a[@class='recmd-user']/img/@src")[0]
zan_num = node.xpath(".//div[@class='recmd-num']/span[position()=1]/text()")[0]
ping_num = node.xpath(".//div[@class='recmd-num']/span[position()=4]/text()")
content = node.xpath(".//a[@class='recmd-content']/text()")
if len(ping_num) > 0:
ping_num = ping_num[0]
else:
ping_num = 0
if len(content) > 0:
content = content[0]
else:
content = ""
result = {
"username": username,
"imgUrl": user_img,
"vote": zan_num,
"comments": ping_num,
"content": content
}
total += 1
f.write((json.dumps(result, ensure_ascii=False) + "\n").encode("utf-8"))
except RuntimeError as e:
print(e) def main():
# 将采集到的html保存到队列
for i in range(1, 21):
page_queue.put(i)
# 开启采集线程
get_html_thread = []
for i in range(100):
get_html = GetHtml(page_queue)
get_html.start()
get_html_thread.append(get_html)
# 等待所有采集线程完成
for thread in get_html_thread:
thread.join()
# 开启解析线程
parse_html_thread = []
for i in range(100):
parse_html = ParseHtml()
parse_html.start()
parse_html_thread.append(parse_html)
# 等待所有解析线程完成
for thread in parse_html_thread:
thread.join()
# 关闭文件
f.close()
print("采集数据完成,总共%s条数据" % total) if __name__ == '__main__':
data_queue = queue.Queue()
page_queue = queue.Queue()
f = open("./qunaerwang.json", "wb")
total = 0
main()
数据:
{"username": "夲少姓〖劉〗", "imgUrl": "//pic.qiushibaike.com/system/avtnew/1187/11878716/thumb/20190520091055.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "马中赤兔人中啥了?"}
{"username": "一枕清霜゛", "imgUrl": "//pic.qiushibaike.com/system/avtnew/3371/33712263/thumb/20190511210156.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "一个段子手,一个神回复"}
{"username": "窝里斗窝里", "imgUrl": "//pic.qiushibaike.com/system/avtnew/1427/14275616/thumb/20181228173532.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "鹰科猛禽走路的姿势看上去总是屌屌的!!"}
{"username": "2丫头还是个宝宝", "imgUrl": "//pic.qiushibaike.com/system/avtnew/2219/22190863/thumb/20190131225946.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "都说孩子玩沙子有助于孩子的智力发育,所以家里买了一车沙子放院子给逗逗玩。逗逗拿了一个铲子和一个望远镜玩具,当着我的面把望远镜在埋沙子里。拉着我的手:妈妈,我在沙"}
{"username": "★像风一样一样★", "imgUrl": "//pic.qiushibaike.com/system/avtnew/2716/27163432/thumb/20180306191622.JPEG?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "去朋友家看到的,特殊的插排,一个插排才多少钱啊?"}
{"username": "无语滴滴", "imgUrl": "//pic.qiushibaike.com/system/avtnew/3782/37821797/thumb/20190430173233.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "朋友和他女友吵架闹分手,我们都去劝。他女友抹抹眼泪看着窗外说了一句话:“要不是还有几个快递在路上,我真想死了算了。”"}
{"username": "愚人愚之不如愚己", "imgUrl": "//pic.qiushibaike.com/system/avtnew/1927/19270659/thumb/20160618154530.jpg?imageView2/1/w/50/h/50", "vote": "", "comments": "", "content": "老司机你发了多大的誓?"}
余下数据省略。。。
往后思路:
1、保存到数据库
2、保存到redis中、然后再同步到数据库
Python 之糗事百科多线程爬虫案例的更多相关文章
- python 爬糗事百科
糗事百科网站段子爬取,糗事百科是我见过的最简单的网站了!!! #-*-coding:utf8-*- import requests import re import sys reload(sys) s ...
- (python)查看糗事百科文字 点赞 作者 等级 评论
import requestsimport reheaders = { 'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; ...
- [爬虫]用python的requests模块爬取糗事百科段子
虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...
- python scrapy实战糗事百科保存到json文件里
编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...
- 爬虫_糗事百科(scrapy)
糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...
- Python爬虫(十八)_多线程糗事百科案例
多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...
- python 多线程糗事百科案例
案例要求参考上一个糗事百科单进程案例 Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 ...
- 【Python爬虫实战】多线程爬虫---糗事百科段子爬取
多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...
- Python爬虫(十七)_糗事百科案例
糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取 ...
随机推荐
- RAR5格式不同词典大小下压缩率的简单测试
一个VMWare虚拟机安装Win7后的磁盘文件进行压缩,已经进行了清理处理,原始大小为12.1GB 词典大小 压缩后大小 压缩比率 32MB 4.08GB 33.7% 256MB 3.88GB 3 ...
- apache2 ubuntu18.04 配置虚拟端口
修改3个文件/etc/apache2/apache2.conf/etc/apache2/ports.conf/etc/apache2/sites-available/000-default.conf ...
- 【C语言】模拟实现strcmp函数
//模拟实现strcmp函数 //str1>str2,返回1 //str1=str2,返回0 //str1<str2,返回-1 #include <stdio.h> #incl ...
- ssh连接断开后 shell进程退出
问题描述:当SSH远程连接到服务器上,然后运行一个服务 ./catalina.sh start,然后把终端开闭(切断SSH连接)之后,发现该服务中断,导致网页无法访问. 解决方法:使用nohup命 ...
- python元组声明要带逗号
python元组声明要带逗号 t2, t3, t4 = (2), (2,),() print(type(t2),type(t3), type(t4)) #<class 'int'> < ...
- PowerDesigner12.5和15.1的破解
不要相信网上盛传的powerdesigner的 license key注冊码,试了好多都无论用,不废话了,直接献上PowerDesigner12.5.PowerDesigner15.1的破解方法. P ...
- android 请求网络异步载入
/** * 封装ProecssDialog对话框 * */ public class LoadDialog extends ProgressDialog { private String title ...
- Spark SQL Catalyst源代码分析之UDF
/** Spark SQL源代码分析系列文章*/ 在SQL的世界里,除了官方提供的经常使用的处理函数之外.一般都会提供可扩展的对外自己定义函数接口,这已经成为一种事实的标准. 在前面Spark SQL ...
- mySql学习笔记:比sql server书写要简单
在学mySql.总的感觉,mySql与Sql Server差不多,语法都很象,但mySql也许是吸取了SQL SERVER的一些经验,SQL语句书写起来更加简单. 比如说,设置主键.索引,SQL SE ...
- git subtree 拆分split repository
subtree出现,是为了取代submodule http://wenku.baidu.com/link?url=ola85Z5tIXJpxCjLTk-dcO81ayXLs68_y6dsmXIa0ni ...