• Python爬虫Scrapy框架(1) -- Scrapy搭建及优酷电影名字爬取简单实现


    x小组实训中,要用到爬虫的地方。从今天起开始学习。

     首先,介绍几篇入门的好文章

    爬虫入门系列(一):快速理解HTTP协议

    爬虫入门系列(二):优雅的HTTP库requests

    爬虫入门系列(三):用 requests 构建知乎 API

    爬虫入门系列(四):HTML文本解析库BeautifulSoup

    爬虫入门系列(五):正则表达式完全指南(上)

    安装scrapy框架

    在window终端执行 pip  install scrapy

    报错:

    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

    解决方法:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

    下载上面网址中的twisted对应版本的whl文件(如我的Twisted‑17.9.0‑cp36‑cp36m‑win_amd64.whl),cp后面是python版本,amd64代表64位,运行命令:

    pip install E:scrapyProjectTwisted-17.9.0-cp36-cp36m-win_amd64.whl

    然后再运行 pip install scrapy 

    创建scrapy新项目

    将CMD切换到E:/scrapyProject文件夹下,执行下面命令,创建名为youkuMoive的项目:

    scrapy startProject youkuMoive

    然而,竟然报错、、

    from lxml import etree

    importError : cannot import name etree

    百度了下,可能是lxml版本的原因

    所以,首先卸载原来的lxml  pip uninstall lxml 

    然后再安装 pip install lxml ,它会自动安装对应的版本的lxml

    然后再次执行创建youkuMoive的命令,便可创建成功了!

    目录结构如:

     scrapy将爬虫分成了4个模块:

    • spiders:爬虫模块。负责配置需要爬取的数据和爬取规则,以及解析结构化数据
    • items:定义我们需要的结构化数据,使用相当于dict
    • pipelines:管道模块,处理spider模块分析好的结构化数据,如保存入库等
    • middlewares:中间件,相当于钩子,可以对爬取前后做预处理,如修改请求header,url过滤等

    Scrapy案例(爬取优酷网站电影名字)

    在CMD中创建爬虫

    scrapy genspider youkuMoiveSpider list.youku.com

    此时在spider文件夹下会出现youkuMoiveSpider.py的文件。

    下面来逐个编写各类文件。

    Items 类(items.py)

    1 import scrapy
    2 
    3 class YoukumoiveItem(scrapy.Item):
    4     # define the fields for your item here like:
    5     moiveName = scrapy.Field()#电影名字
    6     

     Spider 类(youkuMoiveSpider.py)

     1 # -*- coding: utf-8 -*-
     2 import scrapy
     3 from youkuMoive.items import YoukumoiveItem
     4 
     5 class YoukumoivespiderSpider(scrapy.Spider):
     6     name = 'youkuMoiveSpider'
     7     allowed_domains = ['list.youku.com']
     8     start_urls = ['http://list.youku.com/category/show/c_96.html?spm=a2h1n.8251846.filterPanel.5~1~3!3~A']
     9 
    10     def parse(self, response):
    11         subSelector=response.css('li.title')
    12         items=[]
    13         for sub in subSelector:
    14             item=YoukumoiveItem()
    15             item['moiveName']=sub.css('a::attr(title)').extract()
    16             items.append(item)
    17             
    18         return items

     Pipelines类(pipelines.py)

    1 import time
    2 
    3 class YoukumoivePipeline(object):
    4     def process_item(self, item, spider):
    5         now=time.strftime('%Y-%m-%d',time.localtime())
    6         filename='youku'+now+'.txt'
    7         with open(filename,'a') as fp:
    8             fp.write(str(item['moiveName'][0])+"
    
    ")
    9         return item

    Setting(setting.py)

    BOT_NAME = 'youkuMoive'
    
    SPIDER_MODULES = ['youkuMoive.spiders']
    NEWSPIDER_MODULE = 'youkuMoive.spiders'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = True
    
    ITEM_PIPELINES={'youkuMoive.pipelines.YoukumoivePipeline':300}

    执行爬虫脚本:

    scrapy crawl youkuMoiveSpider
    • 报错1

    import win32api

    ModuleNotFoundError:No module named 'win32api'

     解决:安装win32api     pip install pypiwin32 

    • 报错2:刚开始在pipelines中的写入文件时用的是 fp.write(item['moiveName'][0].encode('utf8')+' ') ,从而报出 TypeError: can't concat bytes to str ,网上查找原因,得知原来encode返回的原来是bytes类型,然后便改成了 fp.write(str(item['moiveName'][0].encode('utf8'))+" ") ,不抱错了,但是爬取出的文件是类似 b'xe5xa4xa7xe4xbexa0' 的乱码,然后将 encode('utf8') 去掉就好了。

     把所有bug修复完毕,再次执行脚本,便可得到存储有电影名字的txt文件啦

    另附选择器测试方法:

    在CMD中执行 scrapy shell http://list.youku.com/category/show/c_96.html?spm=a2h1n.8251846.filterPanel.5~1~3!3~A 

    便会在终端返回爬取的网页,response的返回代码为200时表示成功

    css选择器

    css选择 response.css(" ") 

    css选取文本 sub.css("ul.info-list ::text").extract()[0] 

    css选取属性 sub.css('a::attr(title)').extract() 

    xpath选择器

    xpath选择 response.xpath(" ") 

    xpath选取文本 sub.xpath("./h3//text()").extract() 

    xpath选取属性 sub.xpath("./ul/li[1]/img/@src").extract() 

  • 相关阅读:
    angularJS处理table中checkbox的选中状态
    大公司常见表格样式
    github:当你想要使用VSCODE开心提交代码时,出现Git:git@github.com:Permission denied(publickey)解决方案
    angularjs 使用angular-sortable-view实现拖拽效果(包括拖动完成后的方法使用)
    sortable结合angularjs实现拖动排序
    promise的一个简单易懂实例
    angular-ui-select (系列二)远程搜索,页面方框显示的值跟传给后台的值不一样解决方案
    leetcode刷题笔记二十九 两数相除
    scala学习 包和引入
    leetcode刷题笔记二十六 、 二十七、 二十八
  • 原文地址:https://www.cnblogs.com/Hyacinth-Yuan/p/7994539.html
Copyright © 2020-2023  润新知