scrapy爬取BugList记录
安装scarpy-win
常规方法:打开终端,步骤是windows+r,输入cmd回车进入终端。
遇到pip版本过于老旧不能使用,需要升级pip版本,输入
pip install --upgrade pip
回车,升级成功。
安装scrapy命令:
pip install Scrapy
创建scrapy项目
- 新建一个根目录文件夹,例如:BugList
- 通过cmd进入该文件夹内,键入
scrapy startproject BugList
即可创建名为BugList的scarpy项目 - 此时项目文件的包含有:
spiders文件夹:存放你Spider文件,也就是你爬取的py文件
scrapy.cfg:配置文件
items.py:相当于一个容器,和字典较像
middlewares.py:定义Downloader Middlewares(下载器中间件)和Spider Middlewares(蜘蛛中间件)的实现
pipelines.py:定义Item Pipeline的实现,实现数据的清洗,储存,验证。
settings.py:全局配置 - 在spiders文件夹下创建一个
bugList.py
文件,你也可以按住shift-右键-在此处打开命令窗口powershell
,输入:scrapy genspider 文件名 要爬取的网址。
- 到此处,一个完整scarpy项目算是建立完成。
爬虫编写及scrapy设置
-
打开Spider文件夹中刚刚创建的爬虫文件,文件内包含有
class BugListSpider(CrawlSpider):
name
:项目的名字
allowed_domains
:是允许爬取的域名,比如一些网站有相关链接,域名就和本网站不同,这些就会忽略。
start_urls
:是Spider爬取的网站,定义初始的请求url,可以多个。
parse
方法:是Spider的一个方法,在请求start_url后,之后的方法,这个方法是对网页的解析,与提取自己想要的东西。
response
参数:是请求网页后返回的内容,也就是你需要解析的网页。 -
如果需要爬取多个网页,可以预先设置
start_urls=[]
,然后根据某个网页获取子页面的url,再start_urls.append()
即可,例如:
url = 'xxxxxxxxxxxxxx'
res = requests.get(url)
res.encoding='utf-8'
source = BeautifulSoup(res.text).find_all('td', 'id_column')
for index, tag in enumerate(source):
start_urls.append('https:xxxx?id=' + tag.find('a').getText())
- 编写parse方法
sel = Selector(response)
item = BuglistItem()
item['id']=sel.xpath('//*[@id="changeform"]/div[1]/a/b//text()').extract()
#需要定义更多的item,可以在此添加,通过xpath定位到具体元素
yield item
- 编写items.py
添加同parse方法中item相同的元素,例如
id=scrapy.Field()
- setting.py的设置
设置ROBOTSTXT_OBEY = False
表示不遵守机器人协议 - 运行
在cmd中cd进入到scrapy.cfg的同级目录下,键入运行命令
#运行,输出结果到控制窗口
scrapy crawl bugList
#运行,保存爬取结果为指定文件格式,存储至项目文件夹根目录
scrapy crawl myspider -o item.json
scrapy crawl myspider -o item.csv
scrapy crawl myspider -o item.xml
- 快捷运行
如果不想通过cmd运行爬虫程序,可以在scrapy.cfg
文件的同级目录新建start.py
文件,直接运行start.py也可以启动爬虫。
start.py的内容为:
#-*- coding: utf-8 -*-
from scrapy import cmdline
cmdline.execute("scrapy crawl bugList".split())
#scrapy crawl myspider -o item.json
#scrapy crawl myspider -o item.csv
#scrapy crawl myspider -o item.xml
数据处理及输出规则
- scrapy支持自定义规则过滤数据,具体方法在
pipeline.py
中编写。需要导入scrapy.exceptions
中的DropItem
,被过滤的数据通过DropItem
丢弃,过滤规则写在process_item
方法中,示例如下:
#-*- coding: utf-8 -*-
#Define your item pipelines here
#
#Don't forget to add your pipeline to the ITEM_PIPELINES setting
#See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem
class BuglistPipeline(object):
def process_item(self, item, spider):
if len(str(item['description']))<150 or len(str(item['id']))>10 or item['id'] is None:
raise DropItem
else:
return item
- scrapy是多线程爬虫,一般以无序输出item的内部值。如果需要自定义输出的顺序,如csv中的列顺序,可以通过在
setting.py
中增加FEED_EXPORT_FIELDS
,输入值的顺序,示例如下:
#自定义输出顺序
FEED_EXPORT_FIELDS = ["id", "summary", "product","component"]