scrapy_常用快查

生成项目

scrapy startproject <project_name> #生成项目文件

scrapy genspider mySpider 163.com  #生成基本spider模板

scrapy genspider -l #显示spider模板列表

scrapy genspider -d template #预览模板格式

scrapy genspider [-t template] <name> <domain> #指定name和网址生成spider文件,可选指定模板

修改协议

  • settings
# Obey robots.txt rules
ROBOTSTXT_OBEY = False

设置请求和解析

  • spider
# -*- coding: utf-8 -*-
import scrapy
class mySpider(scrapy.Spider):
    name = 'mySpider'
    allowed_domains = ['163.com'] # 限制主站域名
    start_urls = ['http://163.com/']

    def start_requests(self):
        # 必须返回可迭代类型
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
            
    def make_requests_from_url(self, url):
        return scrapy.Request(url, callback=self.parse, method='GET', encoding='utf-8' , dont_filter=False,errback)
        # return scrapy.FormRequest(url, formdata={}, callback=self.parse)

    def parse(self,response):
        response.text
        response.body.decode(encoding='utf-8')

设置headers

  • settings
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
  'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  'Accept-Language': 'en',
}

设置代理

  • middlewares
class ProxyMiddleware(object):
    def process_request(self,request,spider):
        request.meta['proxy']='http://127.0.0.1:9743'
  • settings
# Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    'testproject.middlewares.ProxyMiddleware': 543,
}

设置管道

  • pipelines
from scrapy.exceptions import DropItem
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

class Pipeline_Format(object):
    def process_item(self,item,spider):
        item=pd.DataFrame([dict(item)])
        return item



class Pipeline_MySql(object):
    def __init__(self,user,password,port,database,charset):
        self.user=user
        self.password=password
        self.port=port
        self.database=database
        self.charset=charset

    # 用setting变量初始化自身对象
    @classmethod
    def from_crawler(cls,crawler):
        return cls(
        user=crawler.settings.get('MYSQL_USER'),
        password=crawler.settings.get('MYSQL_PASSWORD'),
        port=crawler.settings.get('MYSQL_PORT'),
        database=crawler.settings.get('MYSQL_DATABASE'),
        charset=crawler.settings.get('MYSQL_CHARSET')
        )
        
    # spider开启时调用,构造engine及连接数据库
    def open_spider(self,spider):
        cracom='mysql+pymysql://{user}:{passwork}@127.0.0.1:{port}/{database}?charset={charset}'
        self.engine=create_engine(cracom.format(
            user=self.user,
            passwork=self.passwork,
            port=self.port,
            database=self.atabase,
            charset=self.charset)
            )
        self.session=sessionmaker(bind=self.engine)()
        
    # spider关闭时调用,断开数据库
    def close_spider(self,spider):
        self.session.close()

    # 处理item,把item写入数据库并返回item
    def process_item(self,item,spider):
        item.to_sql('tbname',con=self.engine,if_exists='append',index=False)
        return item
  • settings
# 开启管道,数值越少越优先处理
ITEM_PIPELINES = {
    'testproject.pipelines.Pipeline_Format': 300,
    'testproject.pipelines.Pipeline_MySql': 400}

# 定义用于连接数据库的参数
MYSQL_DATABASE='scrapy_test'
MYSQL_USER='root'
MYSQL_PASSWORD='123456'
MYSQL_PORT=3306
MYSQL_CHARSET='utf8mb4'

启动项目

scrapy crawl mySpider
scrapy crawl mySpider -o fname.json
-o fname.jl #行格式的json
-o fname.csv
-o fname.htp://url/path/file_name.csv] #上传到网络

构造请求

  • class scrapy.http.Request()
    url (string)– the URL of this request
    callback (callable) – the function that will be called with the response of this request (once its downloaded) as its first parameter. For more information see Passing additional data to callback functions below. If a Request doesn’t specify a callback, the spider’s parse() method will be used. Note that if exceptions are raised during processing, errback is called instead.
    method (string)– the HTTP method of this request. Defaults to ‘GET’.
    meta (dict) – the initial values for the Request.meta attribute. If given, the dict passed in this parameter will be shallow copied.
    body (str or unicode) – the request body. If a unicode is passed, then it’s encoded to str using the encoding passed (which defaults to utf-8). If body is not given, an empty string is stored. Regardless of the type of this argument, the final value stored will be a str (never unicode or None).
    headers (dict) – the headers of this request. The dict values can be strings (for single valued headers) or lists (for multi-valued headers). If None is passed as value, the HTTP header will not be sent at all.
    cookies (dict or list) –the request cookies. These can be sent in two forms.
  • scrapy.FormRequest(url, formdata={}, callback=self.parse [,…])
  • scrapy.FormRequest.from_response(url, formdata={}, callback=self.parse [,…])

构造响应

  • class scrapy.http.Response()
    url (string) – the URL of this response
    headers (dict) – the headers of this response. The dict values can be strings (for single valued headers) or lists (for multi-valued headers).
    status (integer) – the HTTP status of the response. Defaults to 200.
    body (str) – the response body. It must be str, not unicode, unless you’re using a encoding-aware Response subclass, such as TextResponse.
    meta (dict)– the initial values for the Response.meta attribute. If given, the dict will be shallow copied.
    flags (list) – is a list containing the initial values for the Response.flags attribute. If given, the list will be shallow copied.

其他常用函数

response.body #返回二进制文本
response.text #返回可读文本
response.urljoin(href) #返回绝对地址
  • 选择器例子
# 选择器
sel.extract(default='') #返回列表,提取标签内容,没有内容返回''
sel.extract_frist() #返回首个
sel.re('(.*)') #返回列表,提取()内匹配的内容
sel.re_first('(.*)') #返回首个

#(http://doc.scrapy.org/en/latest/_static/selectors-sample1.html)

#根据标签定位
res.xpath('//div/a')
res.css('div a')

#根据属性值定位
res.xpaht('//div[@id="images"]/a)
res.css('div[id=images] a')

#根据属性值包含内容定位
res.xpath('//a[contains(@href,"image")]/img')
res.css('a[href*=image] img')

#定位标签内文本内容
res.xpath('//title/text()') 
res.css('title::text') 

#定位获取属性内容
response.xpath('//a/@href')
response.css('a::attr(href)')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Scrapy 提供了很多方法来进行去重。常用的方法包括: 1. 使用 Scrapy 自带的去重中间件:`scrapy.middlewares.dupefilters.RFPDupeFilter`。 2. 使用 Scrapy 自带的 BloomFilter 去重中间件:`scrapy.middlewares.dupefilters.BLOOMDupeFilter`。 3. 在 spider 中手动实现去重,比如使用 Python 中的集合(set)来存储已爬取过的 URL。 具体使用方法请参考 Scrapy 官方文档:https://docs.scrapy.org/en/latest/topics/practices.html#avoiding-duplicate-requests 。 ### 回答2: 在Scrapy中,去重是通过使用一个组件 called RequestDupeFilter 来实现的。RequestDupeFilter 默认情况下启用,用来确保将来的请求和先前的请求进行对比并且不会重复爬取相同的URL。 RequestDupeFilter 使用哈希表来保存已经处理过的请求。这个哈希表的键是请求的URL,值是一个指纹(我们可以采用默认的指纹算法,也可以自定义),通过比较先前保存的指纹和即将要被爬取的请求的指纹来判断是否是重复请求。 当一个请求被发送到下载器时,RequestDupeFilter 会在哈希表中找请求的URL,如果存在相同的URL,那么就判断为重复的请求并丢弃。如果不存在相同的URL,那么就将这个请求的URL和指纹保存到哈希表中,并将请求发送到下载器进行下载。 有两种方式来配置去重过滤器: 1. 使用默认的去重过滤器:Scrapy 默认启用 RequestDupeFilter,并使用默认的指纹算法。 2. 自定义去重过滤器:如果你想自定义去重过滤器,你需要创建一个派生自 scrapy.dupefilters.BaseDupeFilter 的类,并实现其中的方法。然后,在settings.py 文件中设置 DUPEFILTER_CLASS 配置项为自定义去重过滤器的类路径。 使用 Scrapy 的去重功能可以有效地避免爬虫重复爬取相同的URL,提高爬虫效率。 ### 回答3: Scrapy是一款用于爬取网站数据的Python框架,它提供了丰富的功能来帮助我们高效地进行数据抓取。在进行网页爬取时,经常会遇到需要进行数据去重的情况,以避免重复抓取相同的数据。 Scrapy有多种方式来进行数据去重,以下是其中几种常见的方法: 1. 使用scrapy自带的去重过滤器:Scrapy默认使用基于Python的集合Set进行URL去重,Set会自动排除重复的URL。要开启去重功能,需要在Scrapy项目的settings.py中设置DUPEFILTER_CLASS为scrapy.dupefilters.RFPDupeFilter。 2. 自定义去重过滤器:可以通过继承scrapy.dupefilters.RFPDupeFilter类并重写它的一些方法来实现自定义的去重方式。例如,可以根据URL中的某个参数来判断是否为重复数据,如果是则过滤掉。 3. 使用哈希算法进行去重:可以将每一个请求的URL通过哈希算法进行转换,然后判断该哈希值是否存在于已经请求过的哈希值集合中,如果存在则为重复数据,过滤掉。 4. 使用分布式数据库进行去重:对于大规模的爬虫系统,可以将已经请求过的URL存储在分布式数据库中,每次请求之前先询数据库判断是否为重复数据。 无论采用哪种方式,数据去重对于提高爬虫的效率和减少重复抓取的工作量都是非常重要的。Scrapy提供了灵活且易于扩展的机制来进行数据去重,可以根据具体的需求选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值