博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段
阅读量:6150 次
发布时间:2019-06-21

本文共 4705 字,大约阅读时间需要 15 分钟。

  上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息

  通过命令()创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写了和的基本用法的博文

首先分析网页的结构和抓取流程:

1,下载start_urls,交给parse方法处理

2,parse处理,从中获取本页的文章url(以后获取到文章首图传递个自定义的parse_detail),和下一页的url

3,将下一页的url交给parse方法。继续进行1和2;将文章url传递给自定义的解析函数parse_detail

4,parse方法对下一页的url进行下载,自定义的parse_detial则通过css或者xpath 解析有用的信息传递给Item,次数两个操作是异步操作

以下是源码:

1 # -*- coding: utf-8 -*- 2 import scrapy 3 import re 4 from scrapy.http import Request 5 class JobboleSpider(scrapy.Spider): 6     name = "jobbole" 7     allowed_domains = ["blog.jobbole.com"] 8     start_urls = ['http://blog.jobbole.com/all-posts/'] 9 10     def parse(self, response):11         '''12         进行两部操作:1,从页面抓取所有的文章url交给解析器进行解析这个页面的标题时间点赞数等13                       2,从页面抓取下一个页面的url 进行下载14 15         '''16         #从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析17         #css_urlsresponse.css('#archive .floated-thumb .post-thumb a ::attr(href)').extract()18         post_urls = response.xpath('/html/body/div[1]/div[3]/div/div/a/@href').extract()19         for url in post_urls:20             #同过scrapy的Request()下载,并且交给自定义的parse_detail解析21             #注意:在这里从网页上解析的url是全的url,不需要拼接,若不全则需要进行拼接22             #拼接通过 urllib库的parse中的urljoin("http://blog.jobbole.com/","110769")函数进行拼接23             yield  Request(url,callback=self.parse_detail)24 25         #从网页获取下一页26         #css_next_url = response.css('.next.page-numbers::attr(href)').extract_first()27         next_url = response.xpath('/html/body/div[1]/div[3]/div[21]/a[4]/@href').extract_first()28         if next_url:29             yield Request(next_url,callback=self.parse)30     def parse_detail(self,response):31         #//*[@id="post-110769"]/div[1]/h132         #re_selector = response.xpath('//*[@id="post-110769"]/div[1]/h1/text()')33         #re2_selector = response.xpath('/html/body/div[3]/div[1]/h1/text()')34         #re3_selector = response.xpath('//div[@class="entry-header"]/h1/text()')35 36 37 38         #xpath()中的 text()函数是去除html,查看d标签外的 data的内容39         title = response.xpath('/html//div[@class="entry-header"]/h1/text()')40 41         #xpath()中的extracr()函数作用:将xpath()函数产生的Selector xpath对象的内容,并且以列表的对象返回;其他事去除空格和点号不必要的字符42         add_time=response.xpath('/html//p[@class="entry-meta-hide-on-mobile"]/text()').extract()[0].strip().replace("·","")43 44         #文章点赞人数,contains() 是xpath()的内置函数用法,找出在span中class属性包含'vote-post-up'字符串的标签45         like = response.xpath('//span[contains(@class,"vote-post-up")]/h10/text()').extract()[0]46 47         #文章收藏人数:fav_num  xpath解析 10收藏  re再解析 为:1048         fav_temp = response.xpath('//span[contains(@class,"bookmark-btn")]/text()').extract()[0]49         re_fav_num = re.match(".*(\d+).*",fav_temp)50         if re_fav_num:51             fav_num =  int(re_fav_num.group(1))52         else:53             fav_num = 054         #文章评论人数:解析同收藏人数55         comment_temp = response.xpath('//span[@class="btn-bluet-bigger href-style hide-on-480"]/text()').extract()[0]56         re_comment = re.match(".*(\d+).*",comment_temp)57         if re_comment:58             comment_num = int(re_comment.group(1))59         else:60             comment_num = 061         #文章内容,简单提取,不太复杂的,不深入研究62         content = response.xpath('//div[@class="entry"]').extract()[0]63         #标签:涉及去重评论64         temp_tag = response.xpath('/html//p[@class="entry-meta-hide-on-mobile"]/a/text()')65         tag_list = [x for x in tag if not x.strip().endswith("评论") ]66         tags = ";".join(tag_list)67         pass68 '''69 70         #通过css选择器提取数据71 72         #提取标题 .后面跟的代表的是class的属性73         css_title = response.css(".entry-header h1::text").extract()[0]74 75         #添加时间 提取p标签的class的唯一值为entry-meta-hide-on-mobile属性的标签,::text是提取其内容,与text()相似76         css_add_time =response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","")77 78         #点赞人数:class 属性为vote-post-up 的唯一的标签79         css_like = response.css(".vote-post-up h10::text").extract()[0]80 81         #文章收藏人数,对于数组来说按索引提取有风险,所有需要异常捕获操作,extract_first()就是对其进行异常操作,保证列表为空时不报错82         css_fav_temp = response.css(".bookmark-btn::text").extract_first()83         re_fav_num = re.match(".*(\d+).*",fav_temp)84         if re_fav_num:85             css_fav_num =  re_fav_num.group(1)86 87         #文章评论人数88         re_comment = response.css('a[href="#article-comment"] span::text').extract_first()("0")89         if re_comment:90             comment_num = re_comment.group(1)91 92         #标签:涉及去重评论93         temp_tag = response.css('p[class="entry-meta-hide-on-mobile"] a::text').extract()94         tag_list = [x for x in tag if not x.strip().endswith("评论") ]95         tags = ";".join(tag_list)96  '''

 

  

转载于:https://www.cnblogs.com/ruoniao/p/6878731.html

你可能感兴趣的文章
extman后台登陆问题No such file or directory
查看>>
在Linux下安装邮件服务器Qmail(一)
查看>>
正则表达式--口诀
查看>>
Mysql的转义字符
查看>>
让软件适用于域环境
查看>>
windows 上搭建laravel框架
查看>>
Android dp、dpi、px
查看>>
华为路由AR1220拨号问题求各位大侠解决
查看>>
JSP页面获取集合的长度
查看>>
Zabbix 使用nginx做web服务
查看>>
开发文档的编写(1)
查看>>
try--catch--finally中return返回值执行的顺序(区别)
查看>>
【转】聚集索引和非聚集索引的区别
查看>>
【转】名企HR教你如何过网申
查看>>
【C#】性能计数器
查看>>
cifs协议端口
查看>>
开始学习php了
查看>>
我的友情链接
查看>>
Linux系统下Apache的安装、启动等初级操作
查看>>
监听JVM的几个命令(可用于linux 本机)
查看>>