欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy爬虫

程序员文章站 2022-05-06 19:05:01
...
  1. 安装
    pip install Scrapy
    pip install win32api		
    

安装过程中可能会遇到的错误详见:https://blog.csdn.net/Small_Wchen/article/details/77750849

  1. 创建一个scrapy项目 如淘宝
    scrapy startproject myproject

  2. 创建第一个spiders文件

    cd myproject
    scrapy genspider baiduSpider baidu.com
    
  3. 示例:爬取菜鸟教程里的数据

    #spiders文件
    import scrapy
    from myspiders.items import RunoobItem
    
    
    class RunoobspiderSpider(scrapy.Spider):
    name = 'runoobSpider'
    allowed_domains = ['runoob.com']
    start_urls = ['http://www.runoob.com/']
    
    def parse(self, response):
    #用xpath方法获取想要的标签
        links=response.xpath('//div[@class="col nav"]/ul/li/a')
        items=[]
        for link in links:
        #创建一个item对象
            item=RunoobItem()
            #取到的是数组,所以[0]取到字符串,也可以用extract_first()
            item['href']=link.xpath('./@href')[0].extract()
            item['title']=link.xpath('./text()')[0].extract()
    
            items.append(item)
        return items
    
    #在items里创建一个新类
    from scrapy.item import Item,Field
    class RunoobItem(scrapy.Item):
        href=Field()  #域href=Field()  #域
        title=Field()title=Field()
    
  4. css,xpath,re都可以用来解析response

    #css选择器取属性值
    标签名::attr(属性名)
    #xpath取属性名
    @href
    
  5. 将解析完成的数据保存

    #控制台输入
    #运行文件,baiduSpider是你的name
    scrapy crawl baiduSpider
    #-o后面是保存数据的文件名
    scrapy crawl baiduSpider -o baidu.json
    
  6. 测试工具

    #首先安装iPython
    pip install iPathon
    #进入文件
    cd myproject
    #url是你要测试的网址
    scrapy shell url
    #开始测试
    response.xpath('')
    
  7. 爬取多页信息

    import scrapy
    from myspiders.items import mingyanItem
    
    
    class Mingyan2Spider(scrapy.Spider):
    name = 'mingyan2'
    allowed_domains = ['lab.scrapyd.cn']
    start_urls = ['http://lab.scrapyd.cn/page/1/']
    
    def parse(self, response):
        div=response.xpath('//div[@class="quote post"]')
        for d in div:
        #创建一个item
            item=mingyanItem()
            #文本
            item['text']=d.xpath('./span[@class="text"]/text()')[0].extract()
            #作者
            item['author']=d.xpath('./span/small/text()')[0].extract()
            #链接
            item['href']=d.xpath('./span/a/@href')[0].extract()
            yield item
    	
    	#获取下一页的链接
        next_page=response.xpath('//li[@class="next"]/a/@href')[0].extract()
        #链接是否存在
        if next_page:
        #把链接改为完整路径
            next_page = response.urljoin(next_page)
            #回调
            yield scrapy.Request(next_page,callback=self.parse)
        return item
    
  8. 爬取多页信息

    name = '51jobSpider'
    allowed_domains = ['51job.com']
    start_urls = []
    #第一种写法
    url='https://search.51job.com/list/070300,000000,0000,00,9,99,python,2,1.html'
    url='https://search.51job.com/list/070300,000000,0000,00,9,99,'
    for i in range(1,3):
         url = 'https://search.51job.com/list/070300,000000,0000,00,9,99,'
         query["page"]='2.{0}.html'.format(i)
         url=url+parse.urlencode(query)
         url=parse.quote(url,safe=string.printable)
         start_urls.append(url)
    #第二种写法
    def start_requests(self):
        query = {
                "q":"手机",
                "s":0
            }
        for i in range(2):
            url = "https://s.taobao.com/search?"
            query["s"]=i*48
            url=url+parse.urlencode(query)
            url=parse.quote(url,safe=string.printable)
            yield scrapy.FormRequest(url=url,callback=self.parse)
    
  9. 全局命令
    |命令 |作用 |
    |------------|------------------|
    |startproject|创建项目 |
    |genspider |创建蜘蛛 |
    |settings |查看设置了那些参数 |
    |runspider |基于文件运行py文件 |
    |shell |调试用 |
    |fetch |调试用,用于调试淘宝这类异步传输界面|
    |view |调试用 |
    |version |查看scrapy的版本 |

  10. 局部命令
    |命令|作用 |
    |–|--|
    |crawl |运行蜘蛛 |
    |check|检查蜘蛛|
    |list|蜘蛛的列表|
    |edit| |
    |parse| |
    |bench| |