Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。
以下整理于自己业余写的简单爬虫 theGuardianNews路过朋友有兴趣可以看看。
创建项目
创建新Scrapy项目,在存储代码的目录下git bashscrapy startproject news
这将创建一个名为news的目录,文件tree如下:
news
│ scrapy.cfg # deploy configuration file
└─news # project Python module, import your code from here
│ items.py # project items definition file
│ middlewares.py # project middlewares file
│ pipelines.py # project pipelines file
│ settings.py # project settings file
│ __init__.py
└─spiders # a directory where you will later put your spiders
│ __init__.py
编写Spiders
定义Spider类用来从网站中提取信息。
- 必须子类化
scrapy.Spider
并定义要生成的初始请求 - 可选地如何跟踪页面中的链接
- 解析下载的页面内容以提取数据
在news目录下cmd输入scrapy genspider news theguardian.com
1 | import scrapy |
parse()
方法通常解析响应,将抽取的数据提取为dicts,并查找要遵循的新URL并Request
从中创建新的request()
提取数据
强烈安利用scrapy shell url
的方式先在shell里试试,这样不会运行几次就被反爬。
::text
表示抽取标签内字符串,::attr(title)
表示抽取title属性内容
extract()
为一个包含数据串的list,extract_first()
为list的第一个值
1 | urls = response.css('a[class="fc-item__link"]').css('a[data-link-name="article"]').xpath('@href').extract() |
创建Item
打开news文件夹下的items.py创建类NewsItem
1 | class NewsItem(scrapy.Item): |
设置Pipeline
Item pipeline组件有两个典型作用:1. 查重丢弃 ;2. 保存数据到文件或数据库中。
假设我们采用本地json存取:
1 | from scrapy.exceptions import DropItem |
之后别忘了在setting中改一下ITEM_PIPELINES
的设置:
1 | ITEM_PIPELINES = { |
假设我们采用MongoDB,打开news文件夹下的pipelines.py创建类NewsPipline
1 | from scrapy.exceptions import DropItem |
同样我们需要在setting中改一下ITEM_PIPELINES
的设置:
1 | ITEM_PIPELINES = { |
修改Spider
1 | from news.items import NewsItem |
修改完的spider如下:
1 | import scrapy |
修改设置
打开news文件夹下的settings.py可以修改一些小细节便于我们爬取数据。
TIPS:加上FEED_EXPORT_ENCODING = 'utf-8'
适用于爬取中文内容哦。
1 | FEED_EXPORT_ENCODING = 'utf-8' # 修改编码为utf-8 |
针对反爬
去奥斯汀访学(旅游)时候写的yelp爬虫 yelpReview路过朋友有兴趣可以看看。
- 使用user agent池,轮流选择之一来作为user agent;池中包含常见的浏览器的user agent。
- 禁止cookies(参考
COOKIES_ENABLED
),有些站点会使用cookies来发现爬虫的轨迹。 - 设置下载延迟(2或更高)。参考
DOWNLOAD_DELAY
设置。 - 如果可行,使用 Google cache 来爬取数据,而不是直接访问站点。
- 使用IP池。例如免费的 Tor项目 或付费服务(ProxyMesh)。
- 使用分布式下载器(downloader)来绕过禁止(ban),就只需要专注分析处理页面。eg: Crawlera
Mongodb
创建userAdminAnyDatabase角色,用来管理用户,可以通过这个角色来创建、删除用户。
1 | use admin |
以上是我怕忘了自己设置过的user和pwd各位游客可以不用在意(小声)
打开安装mongoDB环境的命令行,比如我之前是在Windows下安装的,故打开cmd输入mongo
会有如下输出:
1 | MongoDB shell version v3.4.10-58-g9847179 |
然后我个人安利下可视化工具adminMongo下载轻松简单(主要是界面好看清爽)
打开adminMongo目录,npm start
会有如下输入,根据提示打开http://localhost:1234即可
1 | admin-mongo@0.0.23 start D:\adminMongo |
打开页面后,connection名字仅供参考(随便设)MongoDB连接字符串的格式可以是:mongodb://<user>:<password>@127.0.0.1:<port>/<db>
指定mongodb://:@127.0.0.1:27017
即可。
有关MongoDB连接字符串的更多信息,请参阅正式的MongoDB文档。
写入依赖
打开项目所在文件目录,然后打开命令行输入即可得到requirements.txt
1 | pipreqs ./ --encoding=utf-8 |
这样之后有人需要用这个项目的时候直接打开命令行输入以下即可:
1 | pip install -r requirements.txt |