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:\scrapyProject\Twisted-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])+"\n\n")
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')+'\n\n') ,从而报出 TypeError: can't concat bytes to str ,网上查找原因,得知原来encode返回的原来是bytes类型,然后便改成了 fp.write(str(item['moiveName'][0].encode('utf8'))+"\n\n") ,不抱错了,但是爬取出的文件是类似 b'\xe5\xa4\xa7\xe4\xbe\xa0' 的乱码,然后将 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() 

 

posted @ 2017-12-06 20:47  Hyacinth-Yuan  阅读(1151)  评论(0编辑  收藏  举报