Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
控制台执行命令pip install Scrapy
,如果执行过程中出现building'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required.
则需要在网站https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
下载whl文件,pip安装,再重新运行pip install Scrapy
,即可
image.png
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
原理
绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。 组成部分介绍:
在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行下列命令:scrapy startproject book
创建项目
这些文件分别是:
scrapy.cfg
: 项目的配置文件
book/
: 该项目的python模块。之后您将在此加入代码。
book/items.py
: 项目中的item文件.
book/pipelines.py
: 项目中的pipelines文件.
book/settings.py
: 项目的设置文件.
book/spiders/
: 放置spider代码的目录.
首先要进入book目录,使用basic模板创建一个spider
建立spider, scrapy genspider douban https://book.douban.com/top250?start=0
spider
建立一个main.py文件,在book文件目录下,保证main.py和自动生成的scrapy.cfg在同一层,写入下面代码。此文件是为了方便再pycharm中调试scrapy,提高开发效率
from scrapy.cmdline import execute
import sys,os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy','crawl','douban'])
scrapy crawl douban即启动,名字为douban的spider
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
image.png
image.png
image.png
extract_first()
是为了防止extract()[0]不存在的时候报错
name = node.xpath('td[2]/div[1]/a/text()').extract_first().strip()
summary = node.xpath('td[2]/p[2]/span/text()').extract_first()
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
注意:当在终端运行Scrapy时,请一定记得给url地址加上引号,否则包含参数的url(例如 & 字符)会导致Scrapy运行失败。 image.png
image.png
image.png
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。 (如果不了解ORM, 不用担心,您会发现这个步骤非常简单)。首先根据需要从book获取到的数据对item进行建模。 我们需要从book中获取名字,描述。 对此,在item中定义相应的字段。编辑 book目录中的 items.py 文件:
class BookItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
summary = scrapy.Field()
pass
GitHub地址https://github.com/zhangpu1211/scrapy
解决方案:pip install -i https://pypi.douban.com/simple/ pypiwin32
原因:F12产生的源码,不同于网页源代码,前者可能是js加载完的源代码。response.xpath()是根据网页源代码来提取信息的。
解决方案:pip install service_identity --force --upgrade
在python中的Lib\site-packages\scrapy,编辑该路径下的exporters.py文件,并修改如下内容:
image.png
用sublime打开文件--以...编码保存--UTF-8 with BOM
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有