Python 3.7+PyCharm+Scrapy 2.4.1+MySQL 8.0 爬虫项目快速搭建,包括自定义Pipeline和自定义ImagesPipeline
Scrapy框架
Scrapy是一个用于抓取网站和提取结构化数据的应用程序框架,可用于广泛实用的应用程序,如数据挖掘、信息处理或历史存档。
尽管Scrapy最初是为web数据抓取而设计的,但它也可以使用API来提取数据(如Amazon Associates Web Services)或把它当作通用网络爬虫。
一、安装
- 支持的Python版本
Python 3.6+ - 安装/升级命令
- 安装:
pip install Scrapy
- 升级:
pip install -U Scrapy
二、创建爬虫工程
-
打开PyCharm创建一个空项目
输入项目名称
点击创建
-
打开PyCharm自带的Terminal
-
输入命令回到上一层目录
cd ..
- 创建Scrapy工程
scrapy startproject <project_name> [project_dir]
例:
scrapy startproject pythonProject pythonProject
在project_dir
下创建一个project_name
工程
如果未指定project_name
,它会与project_dir
相同
创建完成后按照提示进入工程目录
:
cd pythonProject
- 在
工程目录
下创建爬虫
scrapy genspider [-t template] <name> <domain>
例:
scrapy genspider mySpider target.url.com
支持模板:basic(默认)、crawl、csvfeed、xmlfeed
这里name
是爬虫的名字;domain
是设置allowed_domains
以及start_urls
,这两个属性可以在爬虫类中修改
三、编写爬虫
1. 编写items
根据网页确定好要爬取的字段,然后在items.py
中编写继承了scrapy.Item
的类,可以根据情况自定义多个类(都要继承scrapy.Item
)
以新闻为例,我想爬取新闻的文本内容与图片:
import scrapy
class NewsItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
article_id = scrapy.Field()
media = scrapy.Field()
url = scrapy.Field()
title = scrapy.Field()
tags = scrapy.Field()
content = scrapy.Field()
publish_time = scrapy.Field()
images = scrapy.Field() # 存放下载下来的磁盘路径
images_urls = scrapy.Field() # 存放要访问的远程路径
2. 编写spider
爬虫是scrapy的主体,在这个部分完成页面数据的抓取。爬虫需要注意的是网站的反爬虫策略,并根据需要绕过反爬虫策略。有些网站可能需要使用鼠标进行滑动或点击操作才能加载数据,这样需要借助selenium来模拟人为操作。
这里主要以理想化的、简单的情况作为示例:
import scrapy
import demjson
from newsdata.items import NewsItem
import time
class ChinanewsSpider(scrapy.Spider):
name = 'chinanews'
allowed_domains = ['这里填写允许访问的域名','包括所有请求的域名','如果某域名不填写可能会导致爬虫失效']
# 请求开始,这里主要是控制爬虫循环部分,根据页码进行访问
def start_requests(self):
for page in range(开始, 结束+1):
yield scrapy.Request(url='http://channel.chinanews.com/某某资源?pager={}&pagenum=100&其他参数={}'.format(page,参数)), callback=self.parse)
# 回调函数,对应上面的callback
def parse(self, response):
# 根据响应中对应的数据格式进行抽取,必要时使用demjson进行str2json格式转换
newsList = demjson.decode(response.text)
for news in newsList:
item =