c爬虫抓取网页数据(talkischeap,showmethecodeshowthe )

优采云 发布时间: 2022-01-09 10:10

  c爬虫抓取网页数据(talkischeap,showmethecodeshowthe

)

  谈话很便宜,给我看代码:

  #coding=utf-8

import sys

from scrapy.spider import BaseSpider

from scrapy.selector import Selector

from scrapy.contrib.spiders import CrawlSpider,Rule

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

import json

reload(sys)

sys.setdefaultencoding('utf8')

class DmozSpider(BaseSpider):

name = "dmoz"

allowed_domains=[""]

start_urls=["http://www.jjkjj.gov.cn/"]

def parse(self,response):

filename = response.url.split("/")[-2]

titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())

open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))

  我们来分析一下代码:

  from scrapy.spider import BaseSpider

  这是基于单页的爬取,所以使用BaseSpider,基于链接跳转的爬虫可以看第二篇文章

   name = "dmoz"

allowed_domains=[""]

start_urls=["http://www.jjkjj.gov.cn/"]

  start_urls是主域名,

  所以 allowed_domain 设置为空

   def parse(self,response):

filename = response.url.split("/")[-2]

titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())

  这个markdown编辑器的缩进有问题,titles.extend... 这行要和上一行保持一样的缩进,否则会报错

  Python 运行时错误,引发 notImplementedError

  遇到此类错误,检查缩进,一般可以解决

  接下来看xpath表达式,

  具体含义是:找到class属性为“Work_News_line”的div,以及它下面label的值

  extract()函数 返回一个unicode字符串,该字符串为XPath选择器返回的数据

  xpath的使用有几点需要注意

  上面第二篇文章中,xpath的使用方式是:

  sel=Selector(response) item=DoubanmoiveItem() item['name']=sel.xpath('//[@id="content"]/h1/span[1]/text()').extract()

  新版本的scrapy不建议这样做

  

  所以我把它改成了上面的

  接下来是最头疼的中文显示问题

  在shell中查看xpath查询结果:

  

  一堆Unicode字符,其实这也算是捕获成功了,但是基本不可用,还是需要转成中文的。

  感觉scrapy,甚至python,在字符集上都不是很好,

  再看上面的代码:

  titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())

  这里声明了一个列表。每次查询到一个值,就将其放入列表中,然后列表需要转换成字符串写入文件。

  python本身提供了str()方法可以将任意对象转换成字符串,但是不支持中文,转换后的字符串还是unicode编码的。

  详情见此贴:str字符串转换

  一种解决方法是使用python自带的json模块

  open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))

  没关系

  我们将捕获的数据写入文件,我们来看看结果:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线