1.安装

win系统下有5个步骤

         pip3 install wheel
         twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
         pip3 install Twisted 17.1.0 cp35 cp35m win_amd64.wheel
         pip install pywin32
         pip install scrapy

2.创建

       scrapy startproject 项目名

         - 创建普通爬虫文件

        cd 项目名 (进入项目目录之后再创建爬虫文件)
        scrapy genspider 爬虫文件名 www.xxx.com   

         - 创建crawlspider的爬虫文件

        scrapy genspider -t crawl 爬虫文件名 www.xxx.com

         - 一般注释掉 allowed_domains = ['www.xxx.com']

3.配置项目

   ROBOTSTXT_OBEY = False 不遵守机器人规则
   USER_AGENT = '' 配置UA
   LOG_LEVEL = 'ERROR'  配置日志级别

         中间件配置,管道配置时将注释取消即可  

4.执行项目

   scrapy crawl 爬虫文件名
   scrapy crawl 爬虫文件名 --nolog 不显示日志运行
   scrapy crawl 爬虫文件名 -o 文件名.csv/json 保存结果到文件

应用

1.持久化本地存储

         1.使用命令,保存的本地文件格式限制为 (json csv xml jl jsonlines marshal pickle)

        scrapy crawl 爬虫文件名 -o 本地文件名.csv 

         2.使用管道

                  - 在settings.py中开启管道!!!

                  - items.py文件中添加字段,如  name = scrapy.Field() 

                  - 注意在爬虫文件中要yield item 管道类中才能接受到item

                  - 在piplines.py文件中的管道类中的process_item函数中处理

                          - 爬虫类

        •  open_spider()
        •  close_spider()
        •  process_item()

2.爬取全部网站的数据

         手动请求发送,在爬虫文件中的parse中,(callback是回调另一个parse解析函数)

       yield scrapy.Request(url,callback)

3.进行post请求发送

         spider类中重写start_requests(self)方法,yield scrapy.FormRequest(url,parse,formdata)

       def start_requestS(self):
           for url in self.start_urls:
               data = { 'kw':'cat'}
               yield scrapy.FormRequest(url=url,callback=self.parse,formdata=data)

4.处理cookie

         - scrapy默认情况下自动处理cookie,在settings.py中配置  

          COOKIES_ENABLED = False

5.请求传参

  - 使用场景:如果使用scrapy爬取的数据没有在同一张页面中,则必须使用请求传参

  - 编码流程:

  - 需求:爬取的是 首页中电影的名称和 详情页中电影的简介(全站数据爬取)

  - 基于起始url进行数据解析(parse)

    - 解析数据

      • 电影的名称
      • 详情页的url
      • 对详情页的url发起手动请求(指定的回调函数parse_detail),进行请求传参(meta)meta传递给parse_detail这个回调函数

               - 封装一个其他页码对应url的一个通用的URL模板

               - 在for循环外部,手动对其他页的url进行手动请求发送(需要指定回调函数==》parse)

               - 定义parse_detail回调方法,在其内部对电影的简介进行解析。解析完毕后,需要将解析到的电影名称和电影的简介封装到同一个item中。

               - 接收传递过来的item,并且将解析到的数据存储到item中,将item提交给管道 

         def parse_news(self,response):
                  item = WangyiproItem()
                  item['title'] = title
                  yield scrapy.Request(url=news_detail_url,callback=self.parse_detail,meta={'item':item})
              
         def parse_detail(self,response):
                  item = response.meta['item']
                  item['content'] = content
                  yield item

5.中间件

         - 在settings中要取消注释才能生效

         - DOWNLOADER_MIDDLEWARES 下载中间件: 批量拦截所有的请求和响应

         - process_request 拦截请求

    1.  用来进行UA伪装,结合UA列表使用
    2.  使用代理ip,结合ip池使用

         - process_response 拦截相应

                  可以在爬取动态加载的页面时结合selenium使用

         from scrapy import signals

         import random

 

         #批量拦截所有的请求和响应

         class MiddlewearproDownloaderMiddleware(object):

                  #UA池

                  user_agent_list = [

                          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "

                          "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",

                          "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "

                          "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",

                          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "

                          "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",

                          "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "

                          "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",

                          "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "

                          "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",

                          "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "

                          "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",

                          "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "

                          "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",

                          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

                          "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

                          "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

                          "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",

                          "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "

                          "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",

                          "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "

                          "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"

                  ]

                  #代理池

                  PROXY_http = [

                          '153.180.102.104:80',

                          '195.208.131.189:56055',

                  ]

                  PROXY_https = [

                          '120.83.49.90:9000',

                          '95.189.112.214:35508',

                  ]

 

                  #拦截正常请求:request就是该方法拦截到的请求,spider就是爬虫类实例化的一个对象

                  def process_request(self, request, spider):

                          print('this is process_request!!!')

                          #UA伪装

                          request.headers['User-Agent'] = random.choice(self.user_agent_list)

                          return None

 

                  #拦截所有的响应

                  def process_response(self, request, response, spider):

 

                          return response

 

                  #拦截发生异常的请求对象

                  def process_exception(self, request, exception, spider):

                          print('this is process_exception!!!!')

                          #代理ip的设定

                          if request.url.split(':')[0] == 'http':

                                   request.meta['proxy'] = random.choice(self.PROXY_http)

                          else:

                                   request.meta['proxy'] = random.choice(self.PROXY_https)

 

                          #将修正后的请求对象重新进行请求发送

                          return request
View Code

相关文章:

  • 2021-08-15
  • 2021-11-24
  • 2021-05-29
  • 2021-11-23
  • 2021-05-19
猜你喜欢
  • 2022-01-18
  • 2021-11-04
  • 2022-12-23
  • 2021-05-22
  • 2022-12-23
  • 2021-08-21
  • 2021-04-14
相关资源
相似解决方案