博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scrapy爬虫系列之四--爬取列表和详情
阅读量:5054 次
发布时间:2019-06-12

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

功能点:如何爬取列表页,并根据列表页获取详情页信息?

爬取网站:东莞阳光政务网

完整代码:https://files.cnblogs.com/files/bookwed/yangguang.zip

主要代码:

yg.py

import scrapyfrom yangguang.items import YangguangItemclass YgSpider(scrapy.Spider):    name = 'yg'    allowed_domains = ['sun0769.com']    start_urls = ['http://wz.sun0769.com/index.php/question/report']    def parse(self, response):        tr_list = response.xpath("//div[@class='greyframe']/table[2]//tr")        for tr in tr_list:            item = YangguangItem()            item["title"] = tr.xpath("./td[2]/a[2]/text()").extract_first()            item["href"] = tr.xpath("./td[2]/a[2]/@href").extract_first()            item["status"] = tr.xpath("./td[3]/span/text()").extract_first()            item["publish_time"] = tr.xpath("./td[last()]/text()").extract_first()            if type(item["href"]) == str:                # 请求详情页                yield scrapy.Request(                    item["href"],                    callback=self.parse_detail,                    meta={
"item": item} ) # 翻页 next_url = response.xpath("//a[text()='>']/@href").extract_first() if next_url is not None: yield scrapy.Request(next_url, callback=self.parse) # 解析详情页 def parse_detail(self, response): item = response.meta["item"] # 获取详情页的内容、图片 item["content"] = response.xpath("//div[@class='wzy1']/table[2]//tr[1]/td[@class='txt16_3']/text()").extract() item["content_image"] = response.xpath("//div[@class='wzy1']/table[2]//tr[1]/td[@class='txt16_3']//img/@src").extract() item["content_image"] = ["http://wz.sun0769.com"+i for i in item["content_image"]] yield item # 对返回的数据进行处理

pipelines.py

class YangguangPipeline(object):    def __init__(self):        self.f = open('yangguang.json', 'w', encoding='utf-8')    def process_item(self, item, spider):        item["content"] = self.process_content(item["content"])        self.f.write(json.dumps(dict(item), ensure_ascii=False) + ',\n')        return item    def process_content(self, content):        # 对内容项里的\xa0 和 空白字符替换为空        content = [re.sub(r"\xa0|\s", "", i) for i in content]        # 对替换过的空字符串去除        content = [i for i in content if len(i) > 0]        return content

 

转载于:https://www.cnblogs.com/bookwed/p/10617789.html

你可能感兴趣的文章
Storm学习笔记1:Storm基本组件
查看>>
markdown语法实例
查看>>
IndexedDB 增删改查 简单的库
查看>>
git使用流程
查看>>
Java的序列化和反序列化
查看>>
selenium IDE常用命令
查看>>
开始写博客了
查看>>
Python selenium之css定位
查看>>
UVA 1525 Falling Leaves
查看>>
03-数据基础
查看>>
CentOS上yum方式安装配置LNMP
查看>>
Spring SpringMvc Hibernate整合
查看>>
Gradle 使用Maven本地缓存
查看>>
程序猿编程十大原则
查看>>
hdu1044
查看>>
MVC+EF之Attribute
查看>>
print_r 打印对象
查看>>
zTree——学习记录之一
查看>>
C++的IO操作
查看>>
v-cloakd的应用场景和使用方法
查看>>