写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储、反反爬虫机制(更换ip代理、设置请求头等)、 异步请求等。这些工作如果每次都要自己从零开始写的话,比较浪费时间。因此Scrapy 把一些基础的东西封装好了,在他上面写爬虫可以变的更加的高效(爬取效率和开发效率)。因此真正在公司里,一些上了量的爬虫,都是使用Scrapy框架来解决。
-
首先通过命令行来创建scrapy项目 输入如下语句创建
scrapy startproject 项目名
执行完毕后将在系统当前目录下创建一个scrapy项目 -
接着在命令行进入到项目所在目录创建爬虫输入如下语句
scrapy genspider 爬虫名称 “请求域名” 即可创建爬虫(注意爬虫名称不能和项目名称相同) -
Scrapy Shell
我们想要在爬虫中使用xpath、beautifulsoup、 正则表达式、css选择器等来提取想要的数据。但是因为scrapy 是一个比较 重的框架。每次运行起来都要等待一段时间。因此要去验证我们写的提取规则是否正确,是个比较麻烦的事情。因此Scrapy 提供了一个shell,用来方便的测试规则。当然也不仅仅局限于这个功能。
打开Scrapy Shell:
打开cmd终端,进入到Scrapy 项目所在的目录,输入命令scrapy shell [链接]。就会进入到scrapy的shell环境中。在这个环境中,我们可以跟在爬虫的parse方法中一样使用了。
在shell中我们可以使用response.text获取到请求页面的html源码,在这里可以测试xpath语法,BeautifuSoup语法,或者正则表达式语法正确与否,不用在项目代码中去测试。更加方便独立。
譬如
scrapy shell “www.baidu.com”
response.xpath("//input[@id=‘su’]/@value").get()
soup.find(“input”,attrs={“id”:“su”})
- 接着在settings.py下设置机器人规则以及请求头信息
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,
‘Accept-Language’: ‘en’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36’
} - 在2中创建的spider.py下编码譬如下代码块
class QsbkSpiderSpider(scrapy.Spider):
#爬虫名称
name = 'qsbk_spider'
#允许的域名
allowed_domains = ['haha56.net']
#起始请求的url,可以是多个
start_urls = ['http://www.haha56.net/duanzi/201105/7940.html']
def parse(self, response):
contents = response.xpath("//div[@class='content']/pre")
print("*" * 30)
for content in contents:
print(content.xpath(".//text()").get())
print("*" * 30)
- 爬虫结果可以在cmd终端查看 在项目路径下打开cmd 键入
scrapy crawl [2中创建的爬虫名称]即可返回运行结果
亦或在ide中新建一个py文件导入cmdline模块在ide内模拟cmd终端运行命令如下代码块
from scrapy import cmdline
cmdline.execute("scrapy crawl qsbk_spider".split())
运行结果如下:
- 可以在pipelines.py下编码存储爬取下来的数据如下代码块 ,但是先要在spider.py中将处理好的数据yield给pipelines如下代码块
def parse(self, response):
contents = response.xpath("//div[@class='content']/pre")
for index, content in enumerate(contents):
print("*" * 30)
content = content.xpath("./text()").get().strip()
content = re.sub(r"[\s+]", "", content)
print(content)
print("*" * 30)
item = QsbkItem(index=index, content=content)
yield item
在pipelines中保存数据的代码块如下,但是先要在settings.py中找到
#Configure item pipelines
#See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
‘qsbk.pipelines.QsbkPipeline’: 300,
}
将改代码段取消注释即可
import json
class QsbkPipeline(object):
def __init__(self):
self.fp = open("./spider_data/amused_words.json", "w", encoding="utf-8")
def open_spider(self, spider):
print("spider begin...")
def process_item(self, item, spider):
item_json = json.dumps(dict(item), ensure_ascii=False)
self.fp.write(item_json + "\n")
print("写入完成...")
return item
def close_spider(self, spider):
self.fp.close()
print("spider ending...")
- 最终写入结果如下图