鱼C论坛

 找回密码
 立即注册
查看: 1958|回复: 2

scrapy 如何对获取到的网页链接进行爬取

[复制链接]
发表于 2018-3-10 15:59:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
试着写了一个scrapy去爬取煎蛋网的段子部分的内容,希望了可以将全部页面的段子爬取保存,之前实现了第一页成功,但希望爬取链接跳转到另一个页面时失败,查了很多资料,但还是无法成功,希望大神帮忙看一下,告诉我错误原因,或者正确的代码

代码如下:(注释可以略过)
import scrapy
from jiandan.items import Jiandanitem

class duan(scrapy.Spider):
    name = "duan_spider"
    allowed_domains = ["jandan"]
    start_urls = ["http://jandan.net/duan"]


    def parse(self,response):
        sel = scrapy.selector.Selector(response)
        sites = sel.xpath('//div[@class="author"]/strong/text()').extract()
        contents = sel.xpath('//div[@class="text"]/p/text()').extract()
        items = []
# item = Jiandanitem() 放在循环外无法迭代
        self.count = 0
        num = len(sites)
        with open("duanzi.txt","a",encoding = 'utf-8') as f:
            for i in range(num):
                item = Jiandanitem()
                self.count += 1
                name = "name" + str(self.count)
                item['name'] = name + sites[i]    #对应item里的name属性
                items.append(item)
                f.write(sites[i] + ":")

                item = Jiandanitem()
                item["content"] = "content" + str(i+1) + contents[i]
                items.append(item)   #不使用print也可以在命令行中打印出来
                f.write(contents[i] + '\n' +'\n')

        urls = [sel.xpath('//div[@class="cp-pagenavi"]/a/@href').extract()[0]]
        print("啊啊啊",urls)
        for url in urls:
            yield response.follow(url,callback = self.parse)   #递归parse获取所有页面的内容
            print('ok')
            break

        return items

命令行显示如下
提问.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-10 17:59:50 | 显示全部楼层
找到原因了,说是回执函数被过滤掉了,具体解决方案可以参考 http://blog.csdn.net/honglicu123/article/details/75453107
但是为什么会被过滤呢,怎么设置才好?又是一个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-13 07:30:20 | 显示全部楼层
  1. import scrapy
  2. from jiandan.items import Jiandanitem

  3. class duan(scrapy.Spider):
  4.     name = "duan_spider"
  5.     allowed_domains = ["jandan"]
  6.     start_urls = ["http://jandan.net/duan"]

  7.     #重写start_requests(),添加代理
  8.     #def start_requests(self):
  9.     #   for url in self.start_urls:
  10.     #        yield scrapy.Request(url,callback = self.parse,meta = {"proxy": "http://14.118.253.22:6666"})


  11.     def parse(self,response):
  12.         sel = scrapy.selector.Selector(response)
  13.         sites = sel.xpath('//div[@class="author"]/strong/text()').extract()
  14.         contents = sel.xpath('//div[@class="text"]/p/text()').extract()
  15.         items = []
  16. # item = Jiandanitem() 放在循环外无法迭代
  17.         self.count = 0
  18.         num = len(sites)
  19.         with open("duanzi.txt","a",encoding = 'utf-8') as f:
  20.             for i in range(num):
  21.                 item = Jiandanitem()
  22.                 self.count += 1
  23.                 name = "name" + str(self.count)
  24.                 item['name'] = name + sites[i]    #对应item里的name属性
  25.                 items.append(item)
  26.                 f.write(sites[i] + ":")

  27.                 item = Jiandanitem()
  28.                 item["content"] = "content" + str(i+1) + contents[i]
  29.                 items.append(item)   #不使用print也可以在命令行中打印出来
  30.                 f.write(contents[i] + '\n' +'\n')
  31.         print("写入内容")
  32.         page = str(response.url)
  33.         with open("duanzi.txt","a",encoding = 'utf-8') as f:
  34.             f.write("-----" + page +"-----" + str(num) + '\n')
  35.         urls = [sel.xpath('//div[@class="cp-pagenavi"]/a[@title="Older Comments"]/@href').extract()[0]] #应该是一个列表,不是字符串,因为之后的for
  36.         print("获取下一页网址",urls)
  37.         for url in urls:
  38.             print("准备爬取下一页")
  39.             yield scrapy.Request("http://" + url, callback=self.parse, dont_filter=True)   #http:和http://输出值一致
  40.             print(response.url)
  41.             #yield response.follow("http:"+url,callback = self.parse,dont_filter=True)
  42.             #递归parse获取所有页面的内容

  43.         print("爬取结束")


  44.         return items
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-28 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表