>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
说明:仅学习参考,如有侵权,将立即删除此内容
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
开发文档
version_2
功能:爬取输入贴吧名字(如“李毅”)的帖子内容,并保存获取的原始html文件,以及处理后的包含相关字段的json文件
函数:next_page_url.py,主要负责获取next_page_url
page_key_info.py,主要负责获取当页关键信息的提取
settings.py完成,存放设置
request_response.py用来处理请求
tiezi_total.py 实现主要逻辑,并爬取相关内容
main_spider.py程序运行的接口(未启用)
文件:jsonfiletotal存放提取出的json数据
技术点:多线程、线程中的通讯(队列)、递归获取下页地址、生产者消费者模型
bug_1:这个版本,目前流程大体上是正确的,但是会在解析第二页内容时,报UnicodeDecodeError,目前本人没能力解决,大佬如果有经验,方便的话,希望可以提点一下。
bug_1修复:问题已解决,代码已修复,主要细节问题,出现在请求下页地址时,没有将其正确的拼凑好。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
源码
# settings.py
# User-Agent池
# waiting do
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
}
# tiezi_total.py
import requests
from urllib import parse
import re
import json
from queue import Queue
from threading import Thread
import time
from settings import HEADERS
from next_page_url import NextPageUrl
from page_key_info import PageKeyInfo
from request_response import RequestResponse
class MainProcess():
"""
接受参数:start_url,tieba_name
"""
def __init__(self, tieba_name, url):
self.tieba_name = tieba_name
self.url = url.format(parse.quote(tieba_name))
self.url_queue = Queue()
self.rawhtml_queue = Queue()
self.content_queue = Queue()
def __make_url_and_rawhtml(self, url):
"""生产url和rawhtml"""
# self.url_queue.put(url)
html_str = RequestResponse(url).run()
next_page_url = NextPageUrl(html_str).run()
print(next_page_url)
# 将html字符串放入队列
self.rawhtml_queue.put(html_str)
while next_page_url:
self.url_queue.put(next_page_url)
return self.__make_url_and_rawhtml(next_page_url)
def __make_key_info(self):
"""消费url和rawhtml,生产content"""
while self.url_queue.not_empty and self.rawhtml_queue.not_empty:
# 从队列中取出一一对应的url和rawhtml
url = self.url_queue.get()
html_str = self.rawhtml_queue.get()
item_list = PageKeyInfo(html_str).run()
# 将当前页url放入相关数据中返回
item = dict(current_page_url=url)
item_list.append(item)
# 将相关数据放入队列
self.content_queue.put(item_list)
# 显示状态
print("开始从当前{}提取信息".format(url))
# 队列计数减1
self.url_queue.task_done()
self.rawhtml_queue.task_done()
def __save_json_file(self):
"""保存相关数据为json文件,消费content"""
while self.content_queue.not_empty:
# 从队列取数
content = self.content_queue.get()
# 构造fil