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做数据提取 ...
随机推荐
- oracle 创建暂时表
提交事务后会自己主动清空,不同的事务之间数据隔离 create global temporary table GLS_REPORT_EXPR ( EXPRNO VARCHAR2(30) not n ...
- 5.Swift教程翻译系列——Swift字符串和字符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或 ...
- Android获取全部存储卡挂载路径
近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...
- mac 显示隐藏文件的命令行和快捷键
命令行方式: 显示隐藏文件: defaults write com.apple.Finder AppleShowAllFiles YES;KillAll Finder 不显示隐藏文件: default ...
- Codesys——PLCopen基本运动控制功能块的使用方法总结
MC_Halt 在MC_MoveVelocity模式下,用MC_Halt停止其轴,当前轴的状态由 ContinuousMotion(当前转速)--->DiscreteMotion(速度不为0)- ...
- [Codeforces Round472C] Three-level Laser
[题目链接] https://codeforces.com/contest/957/problem/C [算法] 二分 注意精度问题 时间复杂度 :O(NlogN) [代码] #include< ...
- Kafka VS Flume
(1)kafka和flume都是日志系统.kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能.flume分为agent(数据采集器),collector(数据简单处理和写入) ...
- PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20
在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...
- 绝对牛x的代码注释
备注:文中字符均可以直接复制直接用! 再补上一个好玩的网站 Ascii World:(链接:http://www.asciiworld.com/). 网站上的图形很多,感兴趣的可以复制链接到浏览器上打 ...
- Java常用集合类
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,Abstract ...