Scrapy入门
平台:windows + Python3.6.8
pip install scrapy
pip install incremental (如果缺少该库则安装该库)
错误信息:
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/visual-cpp-build-tools
原因:需要安装Twisted
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载Twisted-18.9.0-cp36-cp36m-win_amd64.whl
cp后面是python版本,amd64代表64位
pip install Twisted-18.9.0-cp36-cp36m-win_amd64.whl
创建项目
D:\work\pycode>scrapy startproject tutorial
自动生成的文件
tutorial/scrapy.cfg
tutorial/tutorial/items.py
tutorial/tutorial/middlewares.py
tutorial/tutorial/pipelines.py
tutorial/tutorial/settings.py
tutorial/tutorial/__init__.py
tutorial/tutorial/__pycache__
tutorial/tutorial/spiders/__init__.py
tutorial/tutorial/spiders/__pycache__
增加一个例子的步骤
1、首先我们需要创建一个类,并继承scrapy的一个子类:scrapy.Spider 或者是其他蜘蛛类型
2、然后定义一个蜘蛛名,name=“” 后面我们运行的话可能需要用到
3、定义我们需要爬取的网址
4、继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面,简单理解就是下载页面。
具体操作为在spiders目录下新增一个文件myfirst.py
scrapy初始Url的两种写法:
1、直接定义一个方法:star_requests()
2、常量start_urls,并且需要定义一个方法parse()
import scrapy class muhe(scrapy.Spider): #需要继承scrapy.Spider类 name = "mutian" # 定义蜘蛛名 def start_requests(self): # 由此方法通过下面链接爬取页面 # 定义爬取的链接列表 urls = [ r'https://www.huawei.com/cn', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) #爬取到的页面提交给parse方法处理 def parse(self, response): #这里只是简单的把页面做了一个保存 filename = '1.html' with open(filename, 'wb') as f: #response.body就代表了刚才下载的页面 f.write(response.body) self.log('save file')
D:\work\pycode\tutorial>scrapy crawl mutian #mutian是类里面定义的蜘蛛名
........
2019-01-23 15:17:35 [scrapy.core.engine] INFO: Spider opened
2019-01-23 15:17:35 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-23 15:17:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-01-23 15:17:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.huawei.com/robots.txt> (referer: None)
2019-01-23 15:17:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.huawei.com/cn/?ic_medium=direct&ic_source=surlent> (referer:None)
2019-01-23 15:17:35 [mutian] DEBUG: save file
2019-01-23 15:17:35 [scrapy.core.engine] INFO: Closing spider (finished)
.......
运行过程中可能会碰到如下错误:
错误信息:
ModuleNotFoundError: No module named 'win32api'
解决办法:
pip install pypiwin32
常量start_urls,并且需要定义一个方法parse():
import scrapy class muhe(scrapy.Spider): #需要继承scrapy.Spider类 name = "mutian" # 定义蜘蛛名 # 定义爬取的链接列表 start_urls = [ r'https://www.huawei.com/cn', ] def parse(self, response): #这里只是简单的把页面做了一个保存 filename = '1.html' with open(filename, 'wb') as f: #response.body就代表了刚才下载的页面 f.write(response.body) self.log('save file')
D:\work\pycode\tutorial>scrapy crawl mutian
显示结果和之前的相同
Scrapy shell调试工具
scrapy真正的强大是表现在它提取数据的能力上,scrapy提取数据的几种方式:CSS、XPATH、RE(正则)
D:\work\pycode>scrapy shell https://www.huawei.com/cn/ ...... [s] fetch(req) Fetch a scrapy.Request and update local objects [s] shelp() Shell help (print this help) [s] view(response) View response in a browser >>> response.css('title') [<Selector xpath='descendant-or-self::title' data='<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>'>] >>> response.css('title').extract() ['<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>'] >>> response.css('title').extract()[0] '<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>' >>> response.css('title').extract_first() '<title>\r\n\t华为 - 构建万物互联的智能世界\r\n</title>' >>> response.css('title::text').extract_first() '\r\n\t华为 - 构建万物互联的智能世界\r\n'
很直观的验证了你提取的数据对不对
response.css('标签名'),标签名的话可以是html标签比如:title、body、div,也可以是你自定义的class标签
'title::text'在title后面加上了::text ,这代表提取标签里面的数据
我们以抓取https://www.huawei.com/cn/网页源码中的如下内容
<div class="corporate-link-mob mob-corporate-open navbar-collapse collapse" id="corporate-link-mob" aria-expanded="true"> <ul> <li> <h3> <a>集团网站<em class="hwic_to_right" style='display:none;'></em> </a> </h3> <p>公司信息,社会责任,新闻,展会活动,行业洞察等等</p> </li> <li> <h3> <a href="https://consumer.huawei.com/cn" target="_blank"> 个人用户 <em class="hwic_to_right" style=''></em> </a> </h3> <p>手机,PC和平板,穿戴设备等个人及家用产品</p> </li> <li> <h3> <a href="http://e.huawei.com/cn?ic_medium=hwdc&ic_source=corp_header_allwayson&source=corp_header" target="_blank"> 企业用户 <em class="hwic_to_right" style=''></em> </a> </h3> <p>企业商用产品、解决方案和云服务</p> </li> <li> <h3> <a href="http://carrier.huawei.com/cn">运营商用户 <em class="hwic_to_right" style=''></em> </a> </h3> <p>运营商网络解决方案、产品及服务</p> </li> </ul> </div>
D:\work\pycode>scrapy shell https://www.huawei.com/cn/ ...... [s] fetch(req) Fetch a scrapy.Request and update local objects [s] shelp() Shell help (print this help) [s] view(response) View response in a browser >>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text') [<Selector xpath='descendant-or-self::p/text()' data='公司信息,社会责任,新闻,展会活动,行业洞察等等'>, <Selector xpath='descendant-or-self::p/text()' data='手机,PC和平板,穿戴设备等个人及家用产品'>, <Selector xpath='descendant-or-self::p/text()' data='企业商用产品、解决方案和云服务'>, <Selector xpath='descendant-or-self::p/text()' data='运营商网络解决方案、产品及服务'>] >>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text')[0] <Selector xpath='descendant-or-self::p/text()' data='公司信息,社会责任,新闻,展会活动,行业洞察等等'> >>> response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a::text').extract()[0] '\r\n 集团网站\r\n' >>> response.css('div.corporate-link-mob').css('ul').css('li').css('p::text').extract()[0] '公司信息,社会责任,新闻,展会活动,行业洞察等等' >>> response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a').extract()[0] '<a>\r\n集团网站\r\n<em class="hwic_to_right" style="display:none;"></em>\r\n</a>'
用代码实现
import scrapy class muhe(scrapy.Spider): name = "mutian" start_urls = [ r'https://www.huawei.com/cn/', ] def parse(self, response): palist = response.css('div.corporate-link-mob').css('ul').css('li').css('h3')
#palist = response.css('div.corporate-link-mob ul h3') #或者这样写,css参数为标签,如果是属性则以"."开始,如果是文本则后面接"::text" palist1 = response.css('div.corporate-link-mob').css('ul').css('li').css('h3').css('a::text') pinfolist = response.css('div.corporate-link-mob').css('ul').css('li').css('p::text') print(len(palist)) #4 print(len(palist1)) #8 print(palist1.extract()[0]) # " 集团网站 " print(palist1.extract()[1]) # " " print(type(palist)) #<class 'scrapy.selector.unified.SelectorList'> print(type(pinfolist)) #<class 'scrapy.selector.unified.SelectorList'> for i in range(len(palist)): a = "---%d---:%s--" % (i, palist[i].css('a::text').extract_first().strip()) info = "---%d---:%s--" % (i, pinfolist[i].extract()) self.log(a) self.log(info)
4
8
集团网站
<class 'scrapy.selector.unified.SelectorList'>
<class 'scrapy.selector.unified.SelectorList'>
2019-01-24 10:06:35 [mutian] DEBUG: ---0---:集团网站--
2019-01-24 10:06:35 [mutian] DEBUG: ---0---:公司信息,社会责任,新闻,展会活动,行业洞察等等--
2019-01-24 10:06:35 [mutian] DEBUG: ---1---:个人用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---1---:手机,PC和平板,穿戴设备等个人及家用产品--
2019-01-24 10:06:35 [mutian] DEBUG: ---2---:企业用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---2---:企业商用产品、解决方案和云服务--
2019-01-24 10:06:35 [mutian] DEBUG: ---3---:运营商用户--
2019-01-24 10:06:35 [mutian] DEBUG: ---3---:运营商网络解决方案、产品及服务--
相关学习网站:http://www.scrapyd.cn/

浙公网安备 33010602011771号