HTML5技术

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 - 战神王恒(2)

字号+ 作者:H5之家 来源:H5之家 2016-09-01 11:00 我要评论( )

# 获取所有的url,继续访问,并在其中寻找相同的urlall_urls = hxs.select('//a/@href').extract()for url in all_urls:if url.startswith('http://www.xiaohuar.com/list-1-'):yield Request(url, callback=self.p

# 获取所有的url,继续访问,并在其中寻找相同的url all_urls = hxs.select('//a/@href').extract() for url in all_urls: if url.startswith('http://www.xiaohuar.com/list-1-'): yield Request(url, callback=self.parse)

  即通过yield生成器向每一个url发送request请求,并执行返回函数parse,从而递归获取校花图片和校花姓名学校等信息。

注:可以修改settings.py 中的配置文件,以此来指定“递归”的层数,如: DEPTH_LIMIT = 1

6.scrapy查询语法中的正则:

from scrapy.selector import Selector from scrapy.http import HtmlResponse html = """<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <li><a href="link.html">first item</a></li> <li><a href="link1.html">first item</a></li> <li><a href="link2.html">second item</a></li> </body> </html> """ response = HtmlResponse(url='http://example.com', body=html,encoding='utf-8') ret = Selector(response=response).xpath('//li[re:test(@class, "item-\d*")]//@href').extract() print(ret)

  语法规则:Selector(response=response查询对象).xpath('//li[re:test(@class, "item-\d*")]//@href').extract(),即根据re正则匹配,test即匹配,属性名是class,匹配的正则表达式是"item-\d*",然后获取该标签的href属性。

#!/usr/bin/env python # -*- coding:utf-8 -*- import scrapy import hashlib from tutorial.items import JinLuoSiItem from scrapy.http import Request from scrapy.selector import HtmlXPathSelector class JinLuoSiSpider(scrapy.spiders.Spider): count = 0 url_set = set() name = domain = allowed_domains = [] start_urls = [ , ] def parse(self, response): md5_obj = hashlib.md5() md5_obj.update(response.url) md5_url = md5_obj.hexdigest() if md5_url in JinLuoSiSpider.url_set: pass else: JinLuoSiSpider.url_set.add(md5_url) hxs = HtmlXPathSelector(response) ): item = JinLuoSiItem() item[] = hxs.select().extract() item[] = hxs.select().extract() item[] = hxs.select().re() item[] = hxs.select().extract() item[] = hxs.select().extract() item[] = hxs.select().extract() product_list = [] product_tr = hxs.select() for i in range(2,len(product_tr)): temp = { :hxs.select(%i).extract()[0].strip(), :hxs.select(%i).extract()[0].strip(), } product_list.append(temp) item[] = product_list yield item current_page_urls = hxs.select().extract() for i in range(len(current_page_urls)): url = current_page_urls[i] ): url_ab = url yield Request(url_ab, callback=self.parse) 选择器规则Demo

选择器规则Demo

def parse(self, response): from scrapy.http.cookies import CookieJar cookieJar = CookieJar() cookieJar.extract_cookies(response, response.request) print(cookieJar._cookies)

获取响应cookie

更多选择器规则:

7、格式化处理

  上述实例只是简单的图片处理,所以在parse方法中直接处理。如果对于想要获取更多的数据(获取页面的价格、商品名称、QQ等),则可以利用Scrapy的items将数据格式化,然后统一交由pipelines来处理。即不同功能用不同文件实现。

 items:即用户需要爬取哪些数据,是用来格式化数据,并告诉pipelines哪些数据需要保存。

示例items.py文件:

# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # import scrapy class JieYiCaiItem(scrapy.Item): company = scrapy.Field() title = scrapy.Field() qq = scrapy.Field() info = scrapy.Field() more = scrapy.Field()

 即:需要爬取所有url中的公司名,title,qq,基本信息info,更多信息more。

上述定义模板,以后对于从请求的源码中获取的数据同样按照此结构来获取,所以在spider中需要有一下操作:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Vue.js60分钟webpack项目模板快速入门 - keepfool

    Vue.js60分钟webpack项目模板快速入门 - keepfool

    2016-07-17 16:00

  • Vue.js60分钟browserify项目模板快速入门 - keepfool

    Vue.js60分钟browserify项目模板快速入门 - keepfool

    2016-07-17 14:00

  • 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 - jackson0714

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 - jackson0714

    2016-07-06 11:00

  • Vue.js60分钟组件快速入门(下篇) - keepfool

    Vue.js60分钟组件快速入门(下篇) - keepfool

    2016-07-03 14:04

网友点评
i