第七周爬虫进度记录
前言
本周对于爬虫的健壮性和爬取的速度进行了优化,以及增加了爬虫的去重功能。
一、爬虫的优化
网页爬虫本来出于对下载的速度过快可能被网站发现而被封锁ip考虑,从而设置了下载延迟2s,但是发现不是所有网站都是这样的反爬机制,所以对部分爬虫不做这样的设置。同时发现部分的网页爬虫也同样需要登录才能够获取到全部内容,所以给部分网页爬虫也增加了登录功能。
同样发现在爬取的过程中时间过长可能会出现浏览器内存不足从而导致网站崩溃的情况出现,一般出现这种情况需要手动刷新,我们采取了相关的设置进行优化,并定期清除浏览器内存:
# 让网页不加载图片
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
self.browser = webdriver.Chrome(options=chrome_options)
self.browser.set_page_load_timeout(30)
二、网址去重
为了获取网站的实时数据,我们需要定期对于网站进行数据的爬取,所以我们需要对于网址进行去重处理。但是每次从数据库里面获取数据速度太慢,所以我们在本地的爬虫文件内创建txt文件,里面记录了爬虫爬取完的数据的网址,并在每次爬取后对于该txt文件进行更新。
1.myspider.py(获取txt的网址)
代码如下:
# 重复的url
spider_url = []
def __init__(self):
# 获取重复的url
store_file = os.path.dirname(__file__) + '/repeat.txt'
f = open(store_file, encoding='utf-8')
for i in f.read().split('||'):
self.spider_url.append(i)
2.middlewares.py(进行每次请求的控制)
代码如下:
def process_request(self, request, spider):
# 根据txt的内容来判重
repeat = request.url
if repeat in spider.spider_url:
return HtmlResponse(url=request.url, body=None,
encoding="utf-8", request=request)
3.pipelines.py(数据储存的控制)
代码如下:
from itemadapter import ItemAdapter
import json, codecs, os, csv
class SpiderBaiduPipeline:
def process_item(self, item, spider):
return item
# 保存为csv文件
class Pipiline_ToCSV(object):
content = open(os.path.dirname(__file__) + '/spiders/repeat.txt', encoding='utf_8').read()
repeat = open(os.path.dirname(__file__) + '/spiders/repeat.txt', 'w', encoding='utf_8')
repeat.write(content)
def __init__(self):
#文件的位置
store_file = os.path.dirname(__file__) + '/spiders/baidu.csv'
#打开文件,并设置编码
self.file = codecs.open(filename= store_file, mode= 'wb', encoding='utf_8_sig')
# 写入csv
self.writer = csv.writer(self.file)
def process_item(self, item, spider):
line = (item['title'], item['url'], item['source'], item['timestamp'], item['detail'])
# 逐行写入
if item['detail'] != '':
self.writer.writerow(line)
self.repeat.write(item['url'] + r'||')
return item
def close_spider(self, spider):
self.repeat.close()
self.file.close()
总结
爬虫模块的编写到此就基本结束了。