Python爬虫Scrapy框架(1) -- Scrapy搭建及优酷电影名字爬取简单实现
x小组实训中,要用到爬虫的地方。从今天起开始学习。
首先,介绍几篇入门的好文章
爬虫入门系列(四):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()