记录爬取简书的踩坑过程

踩坑scrapy框架下爬取简书

  如题,在使用scrapy框架爬取简书网的过程中,照常使用crawlspider创建模板,制定规则

    rules = (
        Rule(LinkExtractor(allow=r'.*/p/[0-9a-z]{12}.*'), callback='parse_detail', follow=True),
    )

  然后编写页面解析函数,按照往常的思路->打开控制台->查看页面元素->打开chrome的xpath拓展程序->定位到作者,标题,发布日期,头像,文章内容。好了,这个时候xpath语句验证正确,再在url中分割出文章id。部分代码如下:

        author= response.xpath("//span[@class='_22gUMi']/text()").get()
        title = response.xpath("//h1[@class='_1RuRku']/text()").get()
                picture = response.xpath("//div[@class="_2mYfmT"]/a/img/@src").get()
        pub_time = response.xpath("//div[@class="_2mYfmT"]//time/@datetime").get()
        url = response.url
        article_id = url.split("?")[0].split("/")[-1]
        content  = response.xpath("//article[@class='_2rhmJa']").get()

  接着在pipeline中写入数据库mysql,这里为了节省io操作的时间,使用异步写入

import pymysql
from twisted.enterprise import adbapi
from pymysql import cursors
class JianShutwistedPipeline(object):
    def __init__(self):

        dbparams = {
            'host':'127.0.0.1',
            'port':3306,
            'user':'root',
            'password':'123',
            'database':'jianshu',
            'charset':'utf8',
            'cursorclass':cursors.DictCursor
        }
        self.dbpool = adbapi.ConnectionPool('pymysql',**dbparams)
        self._sql = None
        
    @property
    def sql(self):
        if not self._sql:
            self._sql = """
            insert into article(id,title,content,author,avatar,pub_time,origin_url,article_id)
            values(null,%s,%s,%s,%s,%s,%s,%s)
            """
            return  self._sql
        return self._sql
        
    def process_item(self,item,spider):
        defer = self.dbpool.runInteraction(self.insert_item,item)
        defer.addErrback(self.handle_error,item,spider)
    #单条写入函数
    def insert_item(self,cursor,item):
        cursor.execute(self.sql,(item['title'],item['content'],item['author'],item['picture'],item['pub_time'],                                   item['origin_url'],item['article_id']))
    #错误处理函数
    def handle_error(self,error,item,spider):
        print("="*10+error+"="*10)

然后修改相关设置后开始爬取,在控制台发现控制台的消息
程序在往数据库写入的时候也爆出了元组不能为空的错误,这说明我们xpath语句没有在response中筛选出想要的结果。
  这个时候发现,标签的部分class是乱码,像是机器生成的进行混淆,这个时候我改用绝对路径试了一下:

        picture = response.xpath("/html/body/div/div/div/div/section/div/div/a/img/@src").get()
        pub_time = response.xpath("/html/body/div/div/div/div/section/div/div/div/div[2]//time/text()").get()

再次执行发现还是无法爬取到,然后查看网页源代码,发现源代码中并不存在上述信息,也就是xpath语法筛选的是已经渲染好的页面。这些是属于通过ajax方式异步请求过来的数据,通过开发者模式下的network->xhr进行搜索,并没有找到发送的地址。
  于是我选择使用爬虫中间件,将渲染后的页面返回给解析函数做处理,

from selenium import webdriver
import time
from scrapy.http.response.html import HtmlResponse

class JianshuDownloaderMiddleware(object):
    def __init__(self):
        driver_path = r"D:\Chromedriver\chromedriver.exe"
        self.driver = webdriver.Chrome(executable_path=driver_path)

    def process_request(self,request,spider):
        self.driver.get(request.url)
        time.sleep(1)
        source = self.driver.page_source
        response = HtmlResponse(url = self.driver.current_url,body=source,request=request,encoding='utf-8')
        return  response

修改设置文件后再次进行爬取:
这个时候,无论是否绝对路径的xpath都能筛选到数据了。
成功写入数据库
导出文件
在这里插入图片描述
  这里只是为了查看写入数据库的结果是否正确,就没有导出为csv,也就默认使用了utf8编码,如果导出csv格式,还需要设置编码为excel的gbk,防止打开时乱码。
在这里插入图片描述
  成功。
  如果各位有更好的方式,请不吝赐教。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
scrapy是一个用于网站抓和数据提的Python框架,而微博和简书分别是一个社交媒体平台和一个知识分享平台。要使用scrapy微博评论简书,可以按照以下步骤进行: 首先,需要安装好Python和scrapy框架。可以通过安装Python的pip包管理工具,并使用pip安装scrapy。 然后,对于微博,可以通过登录微博开放平台,注册一个开发者账号,并创建一个应用。获到应用的App Key和Secret Key,以便进行API调用。在scrapy项目的settings.py文件中添加好相应的key。 接下来,使用scrapy创建一个新的项目。可以使用命令行工具执行以下命令:scrapy startproject weibo 在项目的spiders目录下,创建一个新的spider。可以使用命令行工具执行以下命令:scrapy genspider weibo_spider "weibo.com" 编辑新创建的spider,编写微博评论的代码。可以使用weibo API提供的接口进行评论的。 然后,启动虫,执行以下命令:scrapy crawl weibo_spider 在简书的情况下,可以使用简书提供的API接口进行评论的抓。首先,需要注册一个账号,并通过简书的开发者平台获到相应的API Key。然后,使用获到的API Key进行API调用。 创建一个新的spider来实现对简书评论的,类似于上述微博的虫。 最后,启动虫,执行相应的命令来抓简书评论。 总之,使用scrapy微博评论简书可以通过利用它提供的网页抓和数据提功能,结合微博和简书的API进行相应的数据获。通过上述步骤的操作,可以简单实现这个目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值