c爬虫抓取网页数据(talkischeap,showmethecodeshowthe )
优采云 发布时间: 2022-01-09 10:10c爬虫抓取网页数据(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))
没关系
我们将捕获的数据写入文件,我们来看看结果: