zoukankan      html  css  js  c++  java
  • scrapy爬虫笔记(入门级案例)

    初学scrapy框架,很多地方一知半解,先跟着书上的代码一个字一个字敲,还有很多细节值得钻研

    先来个简单的吧,新建一个scrapy项目xiaozhu

    小猪短租信息爬取、不分页、不进入详细页面查找,输出形式为打印

    只搜寻一个网页上的信息 http://bj.xiaozhu.com/search-duanzufang-p2-0/,字段为title(名称)、price(价格)、href(每个房源的详细页链接)

    items.py 修改如下:

    from scrapy import Item,Field
    
    class XiaozhuItem(Item):
        #define the fields for your item here like:
        title = Field()
        price = Field()
        href = Field()
        pass

    settings.py 在默认上面添加了以下信息,其他不动

    # Override the default request headers:
    DEFAULT_REQUEST_HEADERS = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    
    }
    # 配置使用Pipeline
    ITEM_PIPELINES = {
        'xiaozhu.pipelines.XiaozhuPipeline': 300,
    }

    最重要的就是自己写的爬虫规则文件xiaozhuspider.py了

     1 from scrapy.spiders import CrawlSpider
     2 from scrapy.selector import Selector
     3 from xiaozhu.items import XiaozhuItem
     4 
     5 class XiaozhuSpider(CrawlSpider):
     6     # 定义该Spider的名字
     7     name = 'xiaozhu'
     8     # # 定义该Spider允许爬取的域名
     9     #allowed_domains = ['xiaozhu.com']
    10     # 定义该Spider爬取的首页列表
    11     start_urls = ['http://bj.xiaozhu.com/search-duanzufang-p2-0/']
    12 
    13     def parse(self, response):
    14         #print(response,'
    ') # 返回状态码
    15         #print(response.text)
    16         item = XiaozhuItem()
    17         selector = Selector(response)
    18         list = selector.xpath('//*[@id="page_list"]/ul/li')
    19         #print(len(list),list)
    20         for i in list:
    21             #print(i)
    22             item['title'] = i.xpath('div[2]/div[2]/a/span/text()').extract()[0]
    23             item['price'] = i.xpath('div[2]/div[1]/span/i/text()').extract()[0]
    24             item['href'] = i.xpath('a/@href').extract()[0]
    25             #print(item)
    26 
    27             yield item

    说明:

    1. 类的名字推荐按照这样书写,并且类的属性需要按照这样书写

    2. 函数名和参数是固定的格式

    3. 函数体内写爬虫规则,从18行开始就用到的是之前的xpath爬取方法了,区别是每行后面多了一个extract()

    4. item格式是固定的字典型,并且要与items.py中定义的字段名称一致,因为16行item是xiaozhuItem( )的一个对象

    5. 调试阶段可以在本文件中print看结果(但是需要运行整个项目而不是本文件)

    6. 最后yield item 是迭代器,可以简单的认为是return函数吧,但是还是有很多很多不一样的地方,这个不展开说了

    7. 还有个坑就是:第3行引入items.py中的类时,如果按照我这么写会提醒错误,解决方法是将工程文件作为Sources root。设置方法是在PyCharm中选择工程文件夹右键,选择倒数第二行的“Mark Dictionary as”-"Sources root"

    pipelines.py 是写保存方法的,这里单纯的print一下结果

    class XiaozhuPipeline(object):
    
        def process_item(self, item, spider):
            print(item)
            return item

    mian.py 执行语句后面添加.split(),否则报错

    from scrapy import cmdline
    cmdline.execute("scrapy crawl xiaozhu".split())

    运行main.py 打印结果:

    输出和我想象的不太一样呢……问了度娘说改成这样

    scrapy crawl xiaozhu --nolog

    再运行输出结果,bingo!

    
    
    
  • 相关阅读:
    hiho#1445 重复旋律5 求子串数量 后缀自动机
    SPOJ LCS2 后缀自动机
    SPOJ-LCS 后缀自动机
    bzoj 3261 最大异或和 可持久化字典树(01树)
    【洛谷1297】单选错位
    【HAOI2008】木棍分割
    【SDOI2016】排列计数
    【HAOI2008】下落的圆盘
    【HAOI2008】硬币购物
    【洛谷5520】青原樱
  • 原文地址:https://www.cnblogs.com/aby321/p/11248937.html
Copyright © 2011-2022 走看看