diff --git a/README.md b/README.md index 46c2a6f..fd9f941 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,30 @@ redisconn = redis.Redis(host = '127.0.0.1', port = '6379', password = 'x', db = 使用线程数为16的情况下,完整跑完五个种类共 1500条数据,用时80s + + +1,在爬取的视频评论很多的情况下,效率太低,且频次太高了容易被ban。应该设定一下,比如说只爬几页,或者只爬热门评论。而且。。哔哩哔哩的评论区是其他加载的,本爬虫在requests.get的时候,会多次爬取,太危险了。为了一条数据就多次访问,被ban风险更高了。可以改成,对单个页面就取一次网页源代码,但是这个需要真实浏览器来访问才能拿到(selenium框架),然后对这个源代码进行数据提取操作,这样可以比较好地减少爬虫访问量,降低被ban的风险。 + +2,爬虫结构是先完全爬取数据,存到临时内存中,最后才存入文件。风险太大,如果中途被ban了,容易导致整个爬取的过程前功尽弃,且之前数据全都丢失。 + +​ 2.1,线程作用效果应为 + +​ 结构:视频{页数{父评论{子评论}}} + +​ 采用多线程爬取父评论+子评论,也就是一次能对多个父子评论爬取数据;或者采用多线程爬取页数中的评论,一次能爬取多个页面。后者效率更高。 + +​ 2.2,但是由于该爬虫设计结构是把全部数据都先爬取再存起来,这样子要求线程对同一个字符串结构进行数据追加,容易导致混乱(即 在线程优先级不同的情况下,多个线程同时操作一个全局字符串,可能上一条还是父评论,下一条就变成另一条父评论的子评论了。)。 + +​ 2.3,整改建议是:采用多线程对多个页面爬取数据,某个线程结束时即爬完一页就把该页对应的字符串存到csv文件中,采用线程锁来控制每次存数据时都仅单个占用csv文件,防止数据混乱。这一步需要修改数据的存储过程的流程。 + +~~3,爬取效果不好,爬取父评论+子评论的方式,实际上意义不大。意思就是父和子评论都混到一起了,没有主次效果,应该加个标示便于直观显示。~~ + + + + + + + ## 参考链接 1,[selenium+python自动化100-centos上搭建selenium启动chrome浏览器headless无界面模式](https://www.cnblogs.com/yoyoketang/p/11582012.html) @@ -242,4 +266,6 @@ redisconn = redis.Redis(host = '127.0.0.1', port = '6379', password = 'x', db = 15,[requests库使用方法汇总笔记](https://wenku.baidu.com/view/fa71322401020740be1e650e52ea551810a6c928.html) -16, \ No newline at end of file +16,[爬虫:常见的HTTP错误代码及错误原因](https://blog.csdn.net/Smart_look/article/details/109967222) + +17, \ No newline at end of file diff --git a/downloader.py b/downloader.py index 9454aad..daee297 100644 --- a/downloader.py +++ b/downloader.py @@ -1,18 +1,17 @@ # -*- coding: utf-8 -*- +import random + +import requests +from lxml import etree from selenium import webdriver from selenium.webdriver.chrome.options import Options -from lxml import etree -import random -from zmq import proxy import settings -import requests -import json headers = { - #'User-Agent': random.choice(settings.USER_AGENT) - 'User-Agent': settings.USER_AGENT[1] + 'User-Agent': random.choice(settings.USER_AGENT) + # 'User-Agent': settings.USER_AGENT[1] } def getsource(url): @@ -58,4 +57,4 @@ if __name__ == "__main__": url = r"https://www.vveby.com/search?keyword=" + jdurl print(url) useRequests(url) - print('done') \ No newline at end of file + print('done')