Python爬虫(主要是scrapy框架)

一、IP代理池(比较简陋,后续更新)

验证ip,proxies用的是两个协议,http和https都要有

import re

import requests

url = 'https://tool.lu/ip'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}
proxies ={
    'http':'47.243.190.108:7890',
    'https':'47.243.190.108:7890'
}
res = requests.get(url=url,headers=headers,proxies=proxies,timeout=3).text
ip = re.search(r'[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}',res,flags=re.S).group(0)
print(ip)

二、python爬虫之scrapy框架

先贴一张图

Python爬虫(主要是scrapy框架)

基本命令

  • 生成基本框架
scrapy startproject myspider
  • 创建爬虫文件
cd myspider
scrapy genspider -t crawl SpiderName  DomaimName

ps:上面加的参数 -t crawl 是创建crawlspider,里面的Rule方法可以帮助提取url
例:笔趣阁,全站爬取

  • 首先,拿到更多的连接,然后,进入这个分类中,拿到分页的url,再然后,拿到每页的书籍url,并进入详情页
    Python爬虫(主要是scrapy框架)
  • 使用crawlspider,只需要三行就能拿到
    Python爬虫(主要是scrapy框架)
  • 解释一下上面的代码
  • LinkExtractor :提取器(就是提取页面url的,直接将页面url的规则放进去就行)
  • callback : 回调函数,就是提取页面内容,提取url是上面那个方法,这个就用在提取详情页(数据)的时候用
  • follow : 这么想,提取到的页面(page)的url,是不是还要再提取一边每个书籍的url,然后再提取详情页面数据,这个时候,就要加个follow=True
  • 运行
scrapy crawl SpiderName  
  • 运行后的数据就在Python爬虫(主要是scrapy框架)
  • 注意看,这个函数名是parse_item()
  • 如果是不加任何参数的框架,生成的函数时 parse()
scrapy stratproject myspider

response的一些返回值和参数

Python爬虫(主要是scrapy框架)

  • 返回值
  • 就是requests的返回参数,url,headers,status
  • response.body.decode() : 返回文本对象
  • headers :请求头
  • 参数
  • meta :这个参数主要用于传递item字典对象
  • callback:回调函数(有多页数据或有详情页)
  • dont_filter : 默认为False,去重
  • proxy : 设置代理,一般在item字典中
  • request.meta['proxy'] = 'https://' + 'ip:port'
  • setting中的配置
  • download_timeout : 和request模块的timeout一样,设置超时
  • max_retry_times : 最大请求次数(默认两次)
  • dont_retry : 请求失败的url不再请求
  • dont_merge_cookies : scrapy会自动保存返回的cookies,自己添加或不用的话就设置True
  • bindaddress :输出绑定IP
  • ROBOTSTXT_OBEY:是否遵守协议
  • LOG_LEVEL:打印日志等级
    • ERROR
    • WARNING
    • INFO
  • CONCURRENT_REQUESTS :开启线程数
  • DOWNLOAD_DELAY:下载延迟
  • DEFAULT_REQUEST_HEADERS:开启后覆盖默认的请求头
  • 下载中间件和爬虫中间件后面的参数越小,优先级越高

scrapy基本用法

设置run文件(setting同级)

from scrapy import cmdline

cmdline.execute('scrapy crawl xt'.split())

重写方法 start_requests

Python爬虫(主要是scrapy框架)

更改中间件middlewares

随机UA代理

fake_useragent 是一个包,pip install一下

from fake_useragent import UserAgent
class DouyinxingtuUserAgentDownloaderMiddleware:
    def process_request(self, request, spider):
        agent = UserAgent(path='fake_useragent_0.1.11.json').random
        request.headers['User-Agent'] = agent

设置用户代理ip

class DouyinxingtuProxiesDownloaderMiddleware:
    def process_request(self, request, spider):
        porixList = getIp()
        self.porix = random.choice(porixList) # 116.208.24.72:8118
        request.meta['proxy'] ='https://'+self.porix
        print(request.meta)
    # 如果报错,就返回
    def process_exception(self, request, exception, spider):
        print('删除数据库的值')
        return request

设置cookie(scrapy中间件里设置cookie要的是字典格式)

Python爬虫(主要是scrapy框架)
上面是直接从浏览器复制的,将字符串转换成字典

class DouyinxingtuCookieDownloaderMiddleware:
    def process_request(self, request, spider):
        cookie = self.get_cookie()
        cookies = dict([l.split("=", 1) for l in cookie.split("; ")])
        request.cookies=cookies

基于管道存储

先打开setting配置

这个是pipelines里面的类名
Python爬虫(主要是scrapy框架)

管道类配置

# mysql数据库存储
class DouyinxingtuPipelineMysqlSave:
    fp=None
    def open_spider(self,spider):
        print('爬虫开始')
        # 连接数据库

        pass

    def process_item(self,item,spider):
        print(item) # 这个是items中的item
        pass

    def close_spider(self,spider):
        print('爬虫结束')
        pass

个人习惯,引入items中的类

  • 引入类,并赋值

    item = DouyinxingtuItem()
    item['data'] = response['data']
    
  • items
    Python爬虫(主要是scrapy框架)

  • 保存数据库(mysql,原生sql)

上一篇:scrapy-splash


下一篇:爬虫设置代理IP