6月7日,2021年全国高考正式拉开大幕,1078万考生将赶赴考场,迎接人生路上的一次大考。在此,我将使用Scrapy爬取一些励志名句献给广大的高考考生,祝他们高考顺利,学业有成!
流程分析
创建项目
创建爬虫程序
进行初始化设置
分析网页并创建Item
代码实现
创建项目
首先,我们要创建一个项目,通过下面的命令来实现创建项目:
scrapy startproject gsw
执行上述代码后,可以看到在文件下创建了一个名为gsw的项目文件夹,其目录结构如下:
创建爬虫程序
创建好项目后,我们需要先创建一个爬虫程序,之后用来解析网页数据以及生成新的请求。
执行以下代码创建爬虫程序:
cd gsw
scrapy genspider start so.gushiwen.cn
进入刚才创建的gsw文件夹,然后执行genspider命令,第一个参数是spider的名称,第二个参数是网站域名。执行后会在spiders文件夹中生成一个start,也就是刚刚创建的爬虫程序。
进行初始化配置
我们可以在settings.py文件中进行一些配置,例如可以设置日志等级,添加请求头等,具体如下:
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'WARNING'
# 打开项目管道
ITEM_PIPELINES = {
'gsw.pipelines.GswPipeline': 300,
}
# 添加请求头
DEFAULT_REQUEST_HEADERS = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.41',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
分析网站并创建Item
查看网页源代码可以发现,所有的数据都在一个class为son的div标签当中,我们可以先获取到该div,然后遍历其中所有的class为cont的div标签,从中提取相应数据。在此,我们需要提取的数据有诗句以及出处。因此,我们可以在Items中这样写:
import scrapy
class GswItem(scrapy.Item):
content = scrapy.Field()
source = scrapy.Field()
代码实现
至此,我们就可以开始编写代码了。
首先在start.py中添加如下代码:
import scrapy
from gsw.items import GswItem
class StartSpider(scrapy.Spider):
name = 'start'
allowed_domains = ['so.gushiwen.cn']
start_urls = ['https://so.gushiwen.cn/mingjus/default.aspx?tstr=%e5%8a%b1%e5%bf%97']
def parse(self, response):
item = GswItem()
divs = response.xpath('//div[@class="left"]/div[@class="sons"]/div[@class="cont"]')
for div in divs:
item['content'] = div.xpath('./a/text()').extract()[0]
item['source'] = div.xpath('./a/text()').extract()[1]
yield item
在pipelines.py文件中添加如下代码:
class GswPipeline:
def process_item(self, item, spider):
with open('result.txt','a',encoding='utf-8') as f:
f.write(item['content']+item['source']+'\n')
return item
运行结果后,会在gsw目录下生成result.txt文件,结果如下:
爬取多页数据
我们可以通过构造新的URL去爬取多页数据,这里提供两种方法,一是分析网页URL规律,二是从响应数据中提取新的URL。在此,我们使用第二种方法。新增代码如下:
href = response.xpath('//div[@class="pagesright"]/a[1]/@href').extract_first()
url = response.urljoin(href)
yield scrapy.Request(url)
这样就可以实现多页爬取,运行程序后,即可爬取多页数据,最终结果如下:
结语
到此,我们的项目就全部结束了,最后借用韩愈的“口衔山石细,心望海波平”祝各位高考学子都拥有远大志向,榜上有名,考入心中理想的大学!