确定要爬取的网站及内容
笑话大全网站中的冷笑话,如下
要采集的字段,有标题,来源、正文内容
创建scrapy项目
步骤一、启动爬虫项目
在某处(比如桌面)创建一个名称为“scrapy爬取笑话大全”新的文件夹,然后进入该文件夹中空白位置同时点击shift+鼠标右键,在弹出的窗口中选择“在此处打开powershell窗口”,然后输入如下代码指令(代表创建一个名为jokes的项目爬虫)
scrapy startproject jokes
创建完成后,选择进入创建好的文件夹下,输入cd jokes,如下
经过上面语句的输入,可以看到文件夹下多出一些文件(左侧就是该文件多出来的内容)
步骤二、创建一个joke爬虫模板
在刚刚进入的路径下面输入如下代码指令
scrapy genspider joke xiaohua.zol.com.cn
这时候会在spider文件夹下面多出一个joke.py的文件,如下
步骤三、进行爬取网址的修改
start_urls的列表装的就是我们要爬取的具体的网址,可以进行修改,比如这里我们进行笑话大全前两页的爬取,就可以直接把这两页的url放在列表中,然后尝试查看创建的这个爬虫模板是否能正常运行,修改完成后进行保存,如下
这时候就可以直接在powershell窗口执行这个爬虫了,输入代码指令如下
scrapy crawl joke
输出结果如下:(不出意外的话会显示505报错)
★★★★★问题解决
打开setting.py文件,需要对里面的参数进行修改,总共修改三处,针对产生的具体的505错误,添加信任指令,并设置请求头和不遵守robost协议(可以对比本博客的第三张图进行修改),如下:
修改之后保存,然后再在powershell窗口运行刚刚的指令(只需要按一下键盘上的up键,也就是上下左右键的上键,刚刚的指令就出来了),运行结果如下(200代表着数据可以正常访问)
步骤四、查找要爬取数据的对应标签
1) 标题,对应的标签信息如下
2) 来源,对应的标签信息如下
3)正文内容,对应的标签信息如下
标签中内容的获取
打开创建的爬虫模板joke.py,在parse函数下面编写爬取内容的代码如下:(这里使用xpath进行定位,在定位的标签上右键copy然后选择copy XPath,将内容粘贴到下面的括号内即可)
for i in range(1,21):
title = response.xpath(f"//ul/li[{i}]/span[2]/a/text()").extract()
source = response.xpath(f"//ul/li[{i}]/div[1]/span[2]/text()").extract()
content = response.xpath(f"//ul/li[{i}]/div[2]/p/text()").extract()
print('title:\n',title)
print('source:\n',source)
print('content:\n',content)
输出的结果为:
将爬取的内容存到本地
整个joke.py的文件内容如下,这时候在powershell窗口运行scrapy
# -*- coding: utf-8 -*-
import scrapy
class JokeSpider(scrapy.Spider):
name = 'joke'
allowed_domains = ['xiaohua.zol.com.cn']
start_urls = ['http://xiaohua.zol.com.cn/lengxiaohua/1.html',
'http://xiaohua.zol.com.cn/lengxiaohua/2.html']
def parse(self, response):
page = response.url[-6]
file_name = "jokes-{}.txt".format(page)
with open(file_name,'w') as f:
for i in range(1,21):
title = response.xpath(f"//ul/li[{i}]/span[2]/a/text()").extract()
source = response.xpath(f"//ul/li[{i}]/div[1]/span[2]/text()").extract()
content = response.xpath(f"//ul/li[{i}]/div[2]/p/text()").extract()
print('title:\n',title)
print('source:\n',source)
print('content:\n',content)
f.write('title:{}\n source:{}\n content:{}\n'.format(title,source,content))
最后会在jokes文件夹下生成两个txt文本,内容如下