scrapy简书整站爬取

2024-01-03 05:48
文章标签 scrapy 爬取 简书 整站

本文主要是介绍scrapy简书整站爬取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 数据同步及异步存储到MySQL
  • 对于ajax 加载的数据用selenium辅助加载解析
  • 整站爬取提取url规则

使用了scrapy 提供的 crawlspider 提取规则的url列表,scrapy会自动帮我们提取。

jianshu.py 文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from jianshu_spider.items import JianshuSpiderItemclass JianshuSpider(CrawlSpider):name = 'jianshu'allowed_domains = ['jianshu.com']start_urls = ['https://www.jianshu.com/']rules = (# 观察url发现,前缀都一样,后面是12个数字加小写字母的组合Rule(LinkExtractor(allow=r'.*/p/[0-9a-z]{12}.*'), callback='parse_detial', follow=True),)def parse_detial(self, response):title = response.xpath('//h1[@class="title"]/text()').extract_first('') # 提取标题avatar = response.xpath('//a[@class="avatar"]/img/@src').extract_first('') # 提取头像author = response.xpath('//span[@class="name"]/a/text()').extract_first('') # 提取作者publish_time = response.xpath('//span[@class="publish-time"]/text()').extract_first('') # 提取发布时间content = response.xpath('//div[@class="show-content"]').get() # 提取文章内容# 提取文章ip,也就是url上面的不一样的字符串process_url = response.url.split('?')[0] # 以问号分割取前一部分article_id = process_url.split('/')[-1] # 以 ‘/’ 分割获取最后一个字符串即为文章的idorigin_url = response.urlprint(title)item = JianshuSpiderItem(title=title,avatar=avatar,author=author,publish_time=publish_time,content=content,article_id=article_id,origin_url=origin_url)return item

item.py文件

这里主要定义了一些要爬取的字段。还可以扩展爬取更多的字段。

class JianshuSpiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()avatar = scrapy.Field()author = scrapy.Field()publish_time = scrapy.Field()content = scrapy.Field()article_id = scrapy.Field()origin_url = scrapy.Field()

settings.py文件

这里主要是一些设置的文件,包括请求头,打开pipelines,middleware.

ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
DOWNLOADER_MIDDLEWARES = {#'jianshu_spider.middlewares.JianshuSpiderDownloaderMiddleware': 543,'jianshu_spider.middlewares.SeleniumDownloadMiddleware': 543,}
ITEM_PIPELINES = {'jianshu_spider.pipelines.JianshuSpiderPipeline': 300,#'jianshu_spider.pipelines.JianshuTwistedPipeline': 300,}

pipelines.py文件

这里把数据存储到数据库中。同步和异步两种方式。

import pymysql
from twisted.enterprise import adbapi # 使用异步数据库处理连接池
from pymysql import cursors # 数据库游标类class JianshuSpiderPipeline(object):def __init__(self):params = {'host':'127.0.0.1','port':3306,'user':'root','password':'1326628437','database':'jianshu','charset':'utf8'}self.conn = pymysql.connect(**params)self.sursor = self.conn.cursor()self._sql = None@property # 属性操作,可直接调用def sql(self):if not self._sql:self._sql = '''insert into article(title,author,avatar,publish_time,article_id,origin_url,content) value(%s,%s,%s,%s,%s,%s,%s)'''return self._sqlreturn self._sqldef process_item(self, item, spider):self.sursor.execute(self.sql,(item['title'],item['author'],item['avatar'],item['publish_time'],item['article_id'],item['origin_url'],item['content']))self.conn.commit()return item# 异步实现插入数据库,插入操作是io操作,数据量大时,会出现堵塞,异步插入很有必要class JianshuTwistedPipeline(object):def __init__(self):params = {'host':'127.0.0.1','port':3306,'user':'root','password':'1326628437','database':'jianshu','charset':'utf8','cursorclass':cursors.DictCursor}# 调用异步连接池实现异步插入数据库self.dbpool = adbapi.ConnectionPool("pymysql",**params)self._sql = None@propertydef sql(self):if not self._sql:self._sql = '''insert into article(title,author,avatar,publish_time,article_id,origin_url,content) value(%s,%s,%s,%s,%s,%s,%s)'''return self._sqlreturn self._sqldef process_item(self,item,spider):# 异步插入数据defer = self.dbpool.runInteraction(self.insert_item,item)# 错误处理defer.addErrback(self.handle_error,item,spider)def insert_item(self,item,cursor):cursor.execute(self.sql,(item['title'],item['author'],item['avatar'],item['publish_time'],item['article_id'],item['origin_url'],item['content']))def handle_error(self,item,error,spider):print('+'*30 + 'error' + '+'*30)print(error)print('+'*30 + 'error' + '+'*30)

middleware.py文件

这里修改请求过程,目的为了获取ajax加载的url

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.http.response.html import HtmlResponse# 用selenium重写请求过程,实现去爬取一些用ajax加载的页面
# 一些点赞数,评论数,喜欢数,推荐阅读的文章链接都是ajax加载的。
class SeleniumDownloadMiddleware(object):def __init__(self):self.browser = webdriver.Chrome() #self.wait = WebDriverWait(self.browser,10)def process_request(self,request,spider):self.browser.get(request.url)print('我正在用selenium自动化工具下载url')time.sleep(1)try:while True:# 这里因为有些文章下方有许多加载更多,在文章被一下专栏收录里,所以要重复点击showmore = self.browser.find_element_by_class_name('show-more')showmore.click()time.sleep(0.3)if not showmore:breakexcept:passsource = self.browser.page_sourceresponse = HtmlResponse(url=self.browser.current_url,request=request,body=source,encoding='utf-8')return response

这篇关于scrapy简书整站爬取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564682

相关文章

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

python网络爬虫(五)——爬取天气预报

1.注册高德天气key   点击高德天气,然后按照开发者文档完成key注册;作为爬虫练习项目之一。从高德地图json数据接口获取天气,可以获取某省的所有城市天气,高德地图的这个接口还能获取县城的天气。其天气查询API服务地址为https://restapi.amap.com/v3/weather/weatherInfo?parameters,若要获取某城市的天气推荐 2.安装MongoDB

好代码源码网整站数据打包代码

最新数据库版本的好代码资源网整站数据打包代码,最新资源数据,所有数据都有效可用。数据都是更新到最新的2024年6月份的数据。完全明文无加密后门版本定制开发的wordpres主题,无需独立服务器,虚拟主机也可以完美运营,只要主机支持php和mysql即可。 资源下载类网站目前还是红利期,搞个特价主机和域名(域名35元+特价主机100元),再用本代码就可以投入运营了。早运营早收益,挣点小钱、搞点睡后

python scrapy爬虫框架 抓取BOSS直聘平台 数据可视化统计分析

使用python scrapy实现BOSS直聘数据抓取分析 前言   随着金秋九月的悄然而至,我们迎来了业界俗称的“金九银十”跳槽黄金季,周围的朋友圈中弥漫着探索新机遇的热烈氛围。然而,作为深耕技术领域的程序员群体,我们往往沉浸在代码的浩瀚宇宙中,享受着解决技术难题的乐趣,却也不经意间与职场外部的风云变幻保持了一定的距离,对行业动态或许仅有一鳞半爪的了解,甚至偶有盲区。   但正是这份对技术

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件         本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用requests库发送HTTP请求使用lxml库解析HTML文档使用dateti

scrapy 编写扩展 (八)

在scrapy使用过程中,很多情况下需要根据实际需求定制自己的扩展,小到实现自己的pipelines,大到用新的scheduler替换默认的scheduler。 扩展可以按照是否需要读取crawler大致分为两种,对于不需要读取的,比如pipelines的编写,只需要实现默认的方法porcess_item。需要读取的,如scheduler的编写又存在另外的方式。 1.第一种 这种处理起来比较

scrapy 设置爬取深度 (七)

通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度,这个深度是与start_urls中定义url的相对值。也就是相对url的深度。例如定义url为:http://www.domz.com/game/,DEPTH_LIMIT=1那么限制爬取的只能是此url下一级的网页。深度大于设置值的将被ignore。       如图:

Scrapy ——如何防止被ban 屏蔽 之策略大集合(六)

话说在尝试设置download_delay小于1,并且无任何其他防止被ban的策略之后,我终于成功的被ban了。   关于scrapy的使用可参见之前文章:   http://blog.csdn.net/u012150179/article/details/34913315 http://blog.csdn.net/u012150179/article/details/34486677

scrapy自动多网页爬取CrawlSpider类(五)

一.目的。 自动多网页爬取,这里引出CrawlSpider类,使用更简单方式实现自动爬取。   二.热身。 1.CrawlSpider (1)概念与作用: 它是Spider的派生类,首先在说下Spider,它是所有爬虫的基类,对于它的设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。 ࿰

Scrapy ——自动多网页爬取(抓取某人博客所有文章)(四)

首先创建project:   [python]  view plain  copy     转存失败重新上传取消<