标题中的英文首字母大写比较规范,但在python实际使用中均为小写。
爬取伯乐在线网站所有文章的详情页面
1.网页持久化
1.1 新建爬虫工程
新建爬虫工程命令:scrapy startproject BoleSave2
进入爬虫工程目录命令:cd BoleSave2
新建爬虫文件命令:scrapy genspider save blog.jobbole.com
1.2 编辑save.py文件
网页持久化只需要编辑爬虫文件就可以,下面是save.py文件的代码。
第13行dirName变量的值可以设置网页文件保存的位置,例如:
dirName = "d:/saveWebPage"将网页文件保存在D盘的saveWebPage文件夹中。
可以根据个人情况进行修改,不能将其设置为工程所在文件夹,因为Pycharm对工程内大量新文件进行索引会导致卡顿。
import scrapy
import os
import re
def reFind(pattern,sourceStr,nth=1):
if len(re.findall(pattern,sourceStr)) >= nth:
return re.findall(pattern,sourceStr)[nth-1]
else:
return 1
def saveWebPage(response,id,prefix):
# 持久化目录页面
dirName = "d:/saveWebPage2"
if not os.path.isdir(dirName):
os.mkdir(dirName)
html = response.text
fileName = "%s%05d.html" %(prefix,id)
filePath = "%s/%s" %(dirName, fileName)
with open(filePath, 'w', encoding="utf-8") as file:
file.write(html)
print("网页持久化保存为%s文件夹中的%s文件" %(dirName,fileName))
class SaveSpider(scrapy.Spider):
name = 'save'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
def parse(self, response):
pageNum = response.xpath("//a[@class='page-numbers']/text()")[-1].extract()
for i in range(1, int(pageNum) + 1):
url = "http://blog.jobbole.com/all-posts/page/{}/".format(i)
yield scrapy.Request(url, callback=self.parse1)
def parse1(self, response):
page_id = int(reFind("\d+", response.url))
saveWebPage(response,page_id,'directory')
#获得详情页面的链接,并调用下一级解析函数
article_list = response.xpath("//div[@class='post floated-thumb']")
count = 0
for article in article_list:
url = article.xpath("div[@class='post-meta']/p/a[1]/@href").extract_first()
count += 1
article_id = (page_id - 1) * 20 + count
yield scrapy.Request(url,self.parse2,meta={'id':article_id})
def parse2(self, response):
saveWebPage(response,response.meta['id'],'detail')
1.3 编辑settings.py文件
改变并发请求数量,取消变量CONCURRENT_REQUESTS的注释,并改变值为96。
CONCURRENT_REQUESTS = 96
1.4 运行结果
运行