前面已经安装了Scrapy、下面来实现第一个测试程序。
概述
Scrapy是一个爬虫框架,他的基本流程如下所示(下面截图来自互联网)
简单的说,我们需要写一个项目文件,定义返回的数据结构;写一个蜘蛛文件,具体爬取的数据程序,以及一个管道管道文件,作为后续操作,比如保存数据等等。
下面以当当网为例,看看怎么实现。
这个例子里面我想爬取的内容是前面20页的羽绒服产品,包括产品名字,链接和评论数。
过程
1。创建一个Scrapy的项目
<代码> scrapy startproject当当网代码>
2。创建一个爬虫文件* *
<代码> scrapy genspider - t基本dd dangdang.com 代码>
这样他会自动创建一个爬虫文件,结构如下所示:
3。编写items.py
items.py
<代码> # - * -编码:utf - 8 - * #定义这里刮的模型项 # #看文档: # https://doc.scrapy.org/en/latest/topics/items.html 进口scrapy 类DangdangItem (scrapy.Item): #这里定义的字段项: # name=scrapy.Field () title=scrapy.Field () url=scrapy.Field () 评论=scrapy.Field () 代码>
4。编写爬虫文件dd.py
前面第二步已经自动生成了一个模板,我们直接修改就行。
dd.py
<代码> # - * -编码:utf - 8 - * 进口scrapy 从当当网。项目导入DangdangItem 从scrapy。http导入请求 类DdSpider (scrapy.Spider): name=艿堋? allowed_domains=(“dangdang.com”) start_urls=(“http://category.dangdang.com/pg1-cid4010275.html”) def解析(自我,反应): 项=DangdangItem () 项['标题']=response.xpath (u”//[@dd_name=暗テ繁晏狻?/text ()”) .extract () 项目(“url”)=response.xpath (“//[@dd_name=暗テ繁晏狻?/@href”) .extract () 项目(“评论”)=response.xpath (“//[@dd_name=暗テ菲缆邸?/text ()”) .extract () 文本=response.body # content_type=chardet.detect(文本) #如果content_type(“编码”)!=皍tf - 8”: #文本=text.decode (content_type[“编码”]) #=text.encode文本(“utf - 8”) #打印(文本) 收益项 因为我在范围(20): url=' http://category.dangdang.com/pg%d-cid4010275.html ' %我 收益率请求(url,回调=self.parse) 代码>
5。编写pipelines.py
为了使用管道、配置文件需要做个小修改,我顺便关掉了对机器人文件的确认
settings.py
<代码> ROBOTSTXT_OBEY=False ITEM_PIPELINES={ “dangdang.pipelines。DangdangPipeline”: 300年, }代码>
pipeline.py
<代码> # - * -编码:utf - 8 - * #定义项目管道 # #别忘了管道添加到ITEM_PIPELINES设置 #见:https://doc.scrapy.org/en/latest/topics/item-pipeline.html 进口pymysql 类DangdangPipeline(对象): def process_item(自我,物品,蜘蛛): 康涅狄格州=pymysql.connect(主机=127.0.0.1,用户=?passwd=?db=暗钡蓖?use_unicode=True, charset=' use utf8) 因为我在范围(0,len(项目['标题'])): title=项目['标题'][我] 链接=项目(“url”)[我] 评论=项目(“评论”)[我] print(类型(标题)) 打印(标题) # sql="插入dd(标题、链接、评论)值(+名称+“,”“+链接+”、“+ +评论”)” sql="插入dd(标题、链接、评论)值(+名称+“,”“+链接+”、“+ +评论”)” 试一试: conn.query (sql) 除了例外犯错: 通过 conn.close () 返回项目代码>
6。创建数据库和表
我最后的数据要保存到mysql里面,python里面可以通过pymysql进行操作。我提前在mysql命令行界面里面创建了一个数据库和空表
<代码> mysql>创建数据库当当网; mysql>创建表dd (int id auto_increment初级、标题varchar(100),链接varchar(100),评论varchar(32); 代码>
7。执行
scrapy爬dd
如果不想看日志可以使用
scrapy爬dd - nolog