python的scrapy框架学习ing
大家可能都会爬虫,可能都有各自的爬虫工具,但是我觉得如果要靠爬虫吃饭,python的scrapy这个框架还是需要学习一下的,这两天看了一下这个文档,发现效率还是不错的,分布式爬虫,代码量还很少的,效率还是很高的。
开发平台:centos 7
python版本:python3.6
第一步:要使用这个第一步肯定是安装scrapy啦
pip3 install scrapy
第二步:写代码之前一般要干嘛,当然是要新建工程,拿来放置你编写的代码,使用startproject 创建一个scrapy的工程,然后进入这个工程
scrapy startproject ja
cd ja
然后你输入ls,之后会看到两个文件,一个是你以后放置代码的文件ja(该项目的python模块。之后您将在此加入代码),一个就是scrapy的配置文件cfg( 项目的配置文件)
然后这个时候我们在输入 cd ja
tutorial/items.py
: 项目中的item文件.tutorial/pipelines.py
: 项目中的pipelines文件.tutorial/settings.py
: 项目的设置文件.tutorial/spiders/
: 放置spider代码的目录.
然后我们cd spiders目录,进行编写代码
import scrapy class DmozSpider(scrapy.spiders.Spider): name = "jamesavery" #这个名字是要唯一的哦 allowed_domains = ["jamesavery.com"] #域名 start_urls = [ "https://www.jamesavery.com/products/sister-in-my-heart-charm" #这个放置你想要抓取的url列表 ] def parse(self, response): filename = response.url.split("/")[-1] with open(filename, 'wb') as f: f.write(response.body)
parse 是spider的一个方法。
被调用时,每个初始URL完成下载后生成的 Response
对象将会作为唯一的参数传递给该函数。
该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request
对象
(刚刚开始要是不太好理解,你可以这么理解,执行完start_urls之后,就会完成对应的这个网址下载,然后生成的response会调用回调函数parse,进行相应的解析)
执行完上面的程序,就是我们爬取这个网站,然后网站最后一个“/”符号之后的为文件名,保存我的网站源码,当然啦,这样子是远远不够的,我们不止想要网站的源码,还想要具体信息,应该怎么做呢,很easy。
我们先cd ..
回到上一级目录,然后有一个items.py,我们只要把他对应的类做一个稍微修改
class JaItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field() price = scrapy.Field() image = scrapy.Field() sku = scrapy.Field()
这里做一个简单的描述,首先我们想要获取一个产品的标题,产品的地址,产品的描述,产品的价格,产品的图片,产品的sku
我们可以定义一个这样子的item,就是容器,来装载这些东西。
获取到的数据对item进行建模,那我们要做的就是:需要从jamesavery中获取名字,url,以及网站的描述等等。
这里可能你们还有点迷迷糊糊的,没事,我们写代码。
import scrapy import re from ja.items import JaItem class DmozSpider(scrapy.spiders.Spider): name = "jamesavery" allowed_domains = ["jamesavery.com"] start_urls = [ "https://www.jamesavery.com/products/sister-in-my-heart-charm" ] def parse(self, response): for sel in response.xpath('/html'): item = JaItem() item['title'] = sel.css("h1.product-details__name::text").extract() item['link'] = sel.re(r'<link\s*href=\"(.*?)\"') item['desc'] = sel.xpath("//*[@id=\"description\"]/p/text()").extract() item['price'] = sel.re(r'\"price\":\"(.*?)\"') item['image'] = sel.re(r'<meta\s*content=\"(.*?)\"\s*property=\"og:image\">') item['sku'] = sel.re(r'<meta\s*content=\"(.*?)\"\s*name=\"keywords\"') print(item['title'],item['link'],item['desc'],item['price'],item['image'],item['sku'])
根据上面我说的,然后代码这么写,看到parse里面的代码没有,我们获取的数据对原先的item进行建模,然后打印出来就很清晰看到啦,或者这里最后一行的
print(item['title'],item['link'],item['desc'],item['price'],item['image'],item['sku'])
你们可以改成 yield item,把整个item返回
然后执行这条命令,指定输出到ja.json文件
scrapy crawl jamesavery -o ja.json
我目前start_urls里面就放了一个产品的url,大家有没有想过,比如我们要爬取一个网站,需要爬三层,或者四层
我们可以把所有的产品的url丢进start_urls,它采用的分布式的爬虫,一坨丢进去也是点击很快的,而且可以直接采集,解析,存储,非常方便
scrapy有很多的spider,可以根据喜好来选择
最近学习了crawlspider,然后使用crawlspider下载图片的例子
可以参考github
https://github.com/Zhehello/scrapy