python Scrapy框架

Scrapy的架构
在这里插入图片描述

Scrapy的安装
1.先安装python3.6
2.在安装Scrapy
打开http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件
比如:我的Twisted-17.5.0-cp36-cp36m-win_amd64.whl,
cp后面是python版本,
amd64代表64位,运行命令. (分清自己的电脑安装的python是多少位的)
pip install d:\xxx\Twisted-18.7.0-cp36-cp36m-win_amd64.whl
然后pip install Scrapy
Scrapy info

Scrapy的步骤:
新建项目project
明确目标items
制作爬虫spider
存储内容pipeline

  1. 创建项目
scrapy startproject myproject
  1. 明确目标

Item.py

import scrapy
class TorrentItem(scrapy.Item):
    url = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()
    size = scrapy.Field()
  1. 编写spider
    这里需要用到Xpath的使用
XPath
/html/body/h2/text()
//img[@class=“f”]
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
class MininovaSpider(CrawlSpider):

    name = 'mininova'
    allowed_domains = ['mininova.org']
    start_urls = ['http://www.mininova.org/today']
    rules = [Rule(LinkExtractor(allow=['/tor/\d+']), 'parse_torrent')]

    def parse_torrent(self, response):
        torrent = TorrentItem()
        torrent['url'] = response.url
        torrent['name'] = response.xpath("//h1/text()").extract()
        torrent['description'] = response.xpath("//div[@id='description']").extract()
        torrent['size'] = response.xpath("//div[@id='info-left']/p[2]/text()[2]").extract()
        return torrent
import scrapy
class DmozSpider(scrapy.spiders.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

douban的Scrapy

# -*- coding: utf-8 -*-
import scrapy
from firstScrapyProject.items import DoubanmovieItem


class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        for info in response.xpath('//div[@class="item"]'):
            item = DoubanmovieItem()
            item['rank'] = info.xpath('div[@class="pic"]/em/text()').extract()
            item['title'] = info.xpath('div[@class="pic"]/a/img/@alt').extract()
            item['link'] = info.xpath('div[@class="pic"]/a/@href').extract()
            item['star'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()
            item['rate'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[4]/text()').extract()
            item['quote'] = info.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()').extract()
            yield item

            # 翻页
            next_page = response.xpath('//span[@class="next"]/a/@href')
            if next_page:
                url = response.urljoin(next_page[0].extract())
                yield scrapy.Request(url, self.parse)

scrapy.Spider 三个属性 name,start_urls,parse()
执行spider获取数据

scrapy crawl mininova -o scraped_data.json

也可以feed导出 ,csv和xml;如果需要更复杂的,需要编写item pipeline

Selector有四个基本的方法(点击相应的方法可以看到详细的API文档):
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.
extract(): 序列化该节点为unicode字符串并返回list。
re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

在这里插入图片描述
创建新的spider

scrapy genspider mydomain mydomain.com

Feed exports/Item pipeline
yield 返回多个 items

import scrapyfrom myproject.items import MyItem
class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        sel = scrapy.Selector(response)
        for h3 in response.xpath('//h3').extract():
            yield MyItem(title=h3)

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)

yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

#url 相对路径拼接
from urllib.parse import urljoin
x=urljoin('http://www.baidu.com','../index.html')print(x)

Python中yield的简单理解:
yield常见用法:该关键字用于函数中会把函数包装为generator。然后可以对该generator进行迭代: for x in fun(param).

按照我的理解,可以把yield的功效理解为暂停和播放。
在一个函数中,程序执行到yield语句的时候,程序暂停,返回yield后面表达式的值,在下一次调用的时候,从yield语句暂停的地方继续执行,如此循环,直到函数执行完。

扩展:
next函数与send函数很相似,都能获得生成器的下一个yield后面表达式的值,不同的是send函数可以向生成器传参。
yield from:封装包含yield的函数,使得子函数也为一个generator.

另外python的模块:
beautifulsoup
requests
PIT模块
lxml模块
pandas库
pillow 对图片进行剪裁、保存
schedule
个人认为比较好用的:
with open 操作文件 真的好用
format函数 操作字符串
split 切片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值