Scrapy入门

平台:windows + Python3.6.8
pip install scrapy
pip install incremental (如果缺少该库则安装该库)

错误信息:
building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
原因:需要安装Twisted
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载Twisted-18.9.0-cp36-cp36m-win_amd64.whl
cp后面是python版本,amd64代表64位
pip install Twisted-18.9.0-cp36-cp36m-win_amd64.whl 

创建项目
D:\work\pycode>scrapy startproject tutorial

自动生成的文件
tutorial/scrapy.cfg
tutorial/tutorial/items.py
tutorial/tutorial/middlewares.py
tutorial/tutorial/pipelines.py
tutorial/tutorial/settings.py
tutorial/tutorial/__init__.py
tutorial/tutorial/__pycache__
tutorial/tutorial/spiders/__init__.py
tutorial/tutorial/spiders/__pycache__

增加一个例子的步骤
1、首先我们需要创建一个类,并继承scrapy的一个子类:scrapy.Spider 或者是其他蜘蛛类型
2、然后定义一个蜘蛛名,name=“” 后面我们运行的话可能需要用到
3、定义我们需要爬取的网址
4、继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面,简单理解就是下载页面。

具体操作为在spiders目录下新增一个文件myfirst.py

scrapy初始Url的两种写法:
1、直接定义一个方法:star_requests()
2、常量start_urls,并且需要定义一个方法parse()

import scrapy

class muhe(scrapy.Spider): #需要继承scrapy.Spider类    
    name = "mutian" # 定义蜘蛛名
    def start_requests(self): # 由此方法通过下面链接爬取页面
        # 定义爬取的链接列表
        urls = [
            r'https://www.huawei.com/cn',
        ]

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse) #爬取到的页面提交给parse方法处理

    def parse(self, response):
        #这里只是简单的把页面做了一个保存
        filename = '1.html'
        with open(filename, 'wb') as f:
            #response.body就代表了刚才下载的页面
            f.write(response.body)
        self.log('save file')

D:\work\pycode\tutorial>scrapy crawl mutian   #mutian是类里面定义的蜘蛛名
........
2019-01-23 15:17:35 [scrapy.core.engine] INFO: Spider opened
2019-01-23 15:17:35 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-23 15:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-01-23 15:17:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.huawei.com/robots.txt> (referer: None)
2019-01-23 15:17:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.huawei.com/cn/?ic_medium=direct&ic_source=surlent> (referer:None)
2019-01-23 15:17:35 [mutian] DEBUG: save file
2019-01-23 15:17:35 [scrapy.core.engine] INFO: Closing spider (finished)
.......

运行过程中可能会碰到如下错误:

错误信息:
ModuleNotFoundError: No module named 'win32api'
解决办法:
pip install pypiwin32

 

常量start_urls,并且需要定义一个方法parse(): 

import scrapy

class muhe(scrapy.Spider): #需要继承scrapy.Spider类    
    name = "mutian" # 定义蜘蛛名
    # 定义爬取的链接列表
    start_urls = [
        r'https://www.huawei.com/cn',
    ]

    def parse(self, response):
        #这里只是简单的把页面做了一个保存
        filename = '1.html'
        with open(filename, 'wb') as f:
            #response.body就代表了刚才下载的页面
            f.write(response.body)
        self.log('save file')

 D:\work\pycode\tutorial>scrapy crawl mutian

显示结果和之前的相同

 

Scrapy shell调试工具
scrapy真正的强大是表现在它提取数据的能力上,scrapy提取数据的几种方式:CSS、XPATH、RE(正则)

D:\work\pycode>scrapy shell https://www.huawei.com/cn/
......
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
>>> response.css('title')
[<Selector xpath='descendant-or-self::title' data='<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>'>]
>>> response.css('title').extract()
['<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>']
>>> response.css('title').extract()[0]
'<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>'
>>> response.css('title').extract_first()
'<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>'
>>> response.css('title::text').extract_first()
'\r\n\t华为 - 构建万物互联的智能世界\r\n'

很直观的验证了你提取的数据对不对
response.css('标签名'),标签名的话可以是html标签比如:title、body、div,也可以是你自定义的class标签
'title::text'在title后面加上了::text ,这代表提取标签里面的数据

 

我们以抓取https://www.huawei.com/cn/网页源码中的如下内容

<div class="corporate-link-mob mob-corporate-open navbar-collapse collapse" id="corporate-link-mob" aria-expanded="true">
  <ul>

    <li>      
      <h3>
        <a>集团网站<em class="hwic_to_right" style='display:none;'></em>
        </a>
      </h3>
      <p>公司信息,社会责任,新闻,展会活动,行业洞察等等</p>
    </li>
    
    <li>           
      <h3>
        <a href="https://consumer.huawei.com/cn" target="_blank">
                个人用户
           <em class="hwic_to_right" style=''></em>
         </a>
      </h3>
      <p>手机,PC和平板,穿戴设备等个人及家用产品</p>
    </li>

    <li>
      <h3>
        <a href="http://e.huawei.com/cn?ic_medium=hwdc&amp;ic_source=corp_header_allwayson&amp;source=corp_header" target="_blank">
                企业用户
          <em class="hwic_to_right" style=''></em>
        </a>
      </h3>
      <p>企业商用产品、解决方案和云服务</p>
    </li>

    <li>    
      <h3>
        <a href="http://carrier.huawei.com/cn">运营商用户
          <em class="hwic_to_right" style=''></em>
        </a>
      </h3>
      <p>运营商网络解决方案、产品及服务</p>
    </li>
            
  </ul>
</div>

 

D:\work\pycode>scrapy shell https://www.huawei.com/cn/
......
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
>>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text')
[<Selector xpath='descendant-or-self::p/text()' data='公司信息,社会责任,新闻,展会活动,行业洞察等等'>, 
<Selector xpath='descendant-or-self::p/text()' data='手机,PC和平板,穿戴设备等个人及家用产品'>, 
<Selector xpath='descendant-or-self::p/text()' data='企业商用产品、解决方案和云服务'>, 
<Selector xpath='descendant-or-self::p/text()' data='运营商网络解决方案、产品及服务'>]
>>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text')[0]
<Selector xpath='descendant-or-self::p/text()' data='公司信息,社会责任,新闻,展会活动,行业洞察等等'>

>>> response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a::text').extract()[0]
'\r\n 集团网站\r\n'
>>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text').extract()[0]
'公司信息,社会责任,新闻,展会活动,行业洞察等等'
>>> response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a').extract()[0]
'<a>\r\n集团网站\r\n<em class="hwic_to_right" style="display:none;"></em>\r\n</a>'

 

用代码实现

import scrapy

class muhe(scrapy.Spider):
    name = "mutian"
    start_urls = [
        r'https://www.huawei.com/cn/',
    ]

    def parse(self, response):
        palist = response.css('div.corporate-link-mob').css('ul').css('li').css('h3')
#palist = response.css('div.corporate-link-mob ul h3') #或者这样写,css参数为标签,如果是属性则以"."开始,如果是文本则后面接"::text" palist1
= response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a::text') pinfolist = response.css('div.corporate-link-mob').css('ul').css('li').css('p::text') print(len(palist)) #4 print(len(palist1)) #8 print(palist1.extract()[0]) # " 集团网站 " print(palist1.extract()[1]) # " " print(type(palist)) #<class 'scrapy.selector.unified.SelectorList'> print(type(pinfolist)) #<class 'scrapy.selector.unified.SelectorList'> for i in range(len(palist)): a = "---%d---:%s--" % (i, palist[i].css('a::text').extract_first().strip()) info = "---%d---:%s--" % (i, pinfolist[i].extract()) self.log(a) self.log(info)

4
8

集团网站 

<class 'scrapy.selector.unified.SelectorList'>
<class 'scrapy.selector.unified.SelectorList'>
2019-01-24 10:06:35 [mutian] DEBUG: ---0---:集团网站--
2019-01-24 10:06:35 [mutian] DEBUG: ---0---:公司信息,社会责任,新闻,展会活动,行业洞察等等--
2019-01-24 10:06:35 [mutian] DEBUG: ---1---:个人用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---1---:手机,PC和平板,穿戴设备等个人及家用产品--
2019-01-24 10:06:35 [mutian] DEBUG: ---2---:企业用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---2---:企业商用产品、解决方案和云服务--
2019-01-24 10:06:35 [mutian] DEBUG: ---3---:运营商用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---3---:运营商网络解决方案、产品及服务--

 

相关学习网站:http://www.scrapyd.cn/

posted @ 2019-01-23 15:31  牧 天  阅读(189)  评论(0)    收藏  举报