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

  

posted @ 2018-11-13 17:17  WangHello  阅读(295)  评论(0编辑  收藏  举报