Python+Scrapy爬取36氪网新闻

一.准备工作:

​ ①安装python3

​ ②安装scrapy

​ ③安装docker,用来运行splash,splash是用来提供js渲染服务(python中还需利用pip安装scrapy-splash 库)

注意:win10需要安装docker客户端(https://www.docker.com/),Linux的安装就比较简单了(自行百度)。安装上docker后,拉取镜像(docker pull scrapinghub/splash),运行镜像(docker run -p 8050:8050 scrapinghub/splash)。

二.36氪网站分析(https://36kr.com/)

①网站首页如下图,36氪网站首页展示给我们的是文章的列表,观察一下我们会发现36氪的文章都是按时间的顺序排列的,也就是最新的文章都会排在最前面。我们需要爬取的就是下图标注的文章的内容,我使用的方法的先爬取列表所有文章的地址,然后根据每篇文章的地址再去爬取文章的具体内容。

②在36氪首页查看网页源码内容,我使用的是谷歌浏览器(分别按F12和F5),呈现给我们的内容如下图,改变page参数我们可以拿到36氪每页的信息,我们循环给page赋值,就会不断地拿到网站的数据。所以爬取36氪文章列表地址的请求路径是:https://36kr.com/api/search-column/mainsite?per_page=20&page=(参数)

③看一下https://36kr.com/api/search-column/mainsite?per_page=20&page=请求返回的内容,里面有我们想要的文章列表信息,如下图。我们需要做的就是获取response中的data,然后获取每篇文章对应的id及type(post代表文章,video代表视频),通过这两个可以拼接出文章或视频的具体地址,文章(https://36kr.com/p/5158958.html),视频(https://36kr.com/video/21852),不难看出文章地址是https://36kr.com/p+id的形式,视频是https://36kr.com/video+id的形式。这样一来,有了文章的具体地址,我们就可以爬取文章的具体内容了。获取文章地址的局部代码下面也已给出。

target_url='https://36kr.com/api/search-column/mainsite?per_page=20&page='+str(i)+' '
target_request = request.Request(url=target_url)
target_response = request.urlopen(target_request).read().decode('utf_8')
jsonData = json.loads(target_response)
#提取所需信息
newsInfo = jsonData['data']['items']
article_Head = 'https://36kr.com/p/'
video_Head = 'https://36kr.com/video/'
for i in newsInfo:if ('title' in i):#文章一些其他信息title = i['title']id = i['id']type = i['_type']summary = i['summary']published_at = i['published_at']extraction_tags = i['extraction_tags']column_name = i['column_name']cover_pic = i['cover']if type=="video":#文章urlurl_id = video_Head + str(id)else:#视频urlurl_id = article_Head + str(id)+".html"

④对于爬取出的文章url,我保存在了redis里面,然后爬取文章具体内容,从redis取文章url,爬取文章具体内容。爬取文章的具体内容这里需要使用scrapy-splash提供js渲染服务,因为网页的内容是通过js渲染出来的。这样爬取内容更便捷一些。最后通过xpath提取爬取到的内容,具体如何使用xpath提取,可以自行了解一下xpath使用方法,再看看需要提取哪些标签的内容就可以了。代码如下(在我本地粘贴进去比较乱,懒得调整了,哈哈):


    def parse(self, response):p_info = ""image = ""article_content = ""item = MyspiderItem()article_url = response.url# 提取文章具体内容,图片等信息,根据需要自行调整if "video" in article_url:type = "video"author = response.xpath('//div[@class="author am-fl"]/div[@class="am-fl"]/a[@class="user"]/text()').extract()else:type = "article"author = response.xpath('//div[@class="content-font"]//div[@class="author am-fl"]''//span[@class="name"]/text()').extract()content = response.xpath('//div[@class="content-font"]/div/section[@class="textblock"]').extract()infos = response.xpath('//div[@class="content-font"]/div/section[@class="textblock"]//p/span/text()|''//div[@class="content-font"]/div/section[@class="textblock"]//p/text()').extract()imgs = response.xpath('//div[@class="content-font"]/div/section[@class="textblock"]//img/@data-src').extract()

三.配置:

scrapy的结构不熟悉的需要先了解一下(https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html)

①下面是setting的配置,这里面有数据库,代理,自定义的类等配置,有的可能不需要,因人而异。

BOT_NAME = 'ke'
SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'
# ip代理池
ITEM_PIPELINES = {'myspider.pipelines.MyspiderPipeline': 1,
}
MYSQL_HOST = 'x.x.x.x'
MYSQL_DBNAME = 'x'         #数据库名字,请修改
MYSQL_USER = 'x'             #数据库账号,请修改
MYSQL_PASSWD = 'x'         #数据库密码,请修改
MYSQL_PORT = 3306               #数据库端口ROBOTSTXT_OBEY = FalseSPLASH_URL = 'http://x.x.x.x:8050'
#开启两个下载中间件,并调整HttpCompressionMiddlewares的次序
DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723,'scrapy_splash.SplashMiddleware':725,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware':810,'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':None,'myspider.middlewares.MyproxiesSpiderMiddleware':None,'myspider.middlewares.MyspiderResponseMiddleware':None}
#设置去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
#用来支持cache_args(可选)
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware':100,
}
DUPEFILTER_CLASS ='scrapy_splash.SplashAwareDupeFilter'HTTPCACHE_STORAGE ='scrapy_splash.SplashAwareFSCacheStorage'

②items

import scrapyclass MyspiderItem(scrapy.Item):title = scrapy.Field()info = scrapy.Field()content = scrapy.Field()img = scrapy.Field()type = scrapy.Field()info_type = scrapy.Field()info_platform = scrapy.Field()article_url = scrapy.Field()author = scrapy.Field()abstract = scrapy.Field()article_time = scrapy.Field()tags = scrapy.Field()tag = scrapy.Field()cover_pic = scrapy.Field()

③pipelines

import pymysql
import pymysql.cursors
import requests
import os.path as Path
from twisted.enterprise import adbapi
class MyspiderPipeline(object):@classmethoddef from_settings(cls, settings):dbargs = dict(host=settings['MYSQL_HOST'],db=settings['MYSQL_DBNAME'],user=settings['MYSQL_USER'],passwd=settings['MYSQL_PASSWD'],port=settings['MYSQL_PORT'],charset='utf8',cursorclass=pymysql.cursors.DictCursor,use_unicode=True,)dbpool = adbapi.ConnectionPool('pymysql', **dbargs)return cls(dbpool)def __init__(self, dbpool):self.dbpool = dbpool# pipeline默认调用def process_item(self, item, spider):d = self.dbpool.runInteraction(self._conditional_insert, item, spider)  # 调用插入的方法d.addErrback(self._handle_error, item, spider)  # 调用异常处理方法d.addBoth(lambda _: item)return ddef _conditional_insert(self, conn, item, spider):# 保存图片print(item['img'])for img in item['img'].splitlines():ir = requests.get(img)if ir.status_code == 200:fileName = Path.join("d:/image","%s%s" % ((img).replace("/", "_").replace(".", "_").replace(":", "_"),".jpg"))open(fileName, 'wb').write(ir.content)# 插入数据库conn.execute('insert into dingding(info_type,info_platform,title,article_url,info,content,cover_pic,pic,abstract,author,article_time,tag,tags,type) ''value (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',(item['info_type'], item['info_platform'], item['title'], item['article_url'], item['info'], item['content'],item['cover_pic'],item['img'], item["abstract"],item["author"],item['article_time'],item['tag'],item['tags'],item['type']))def _handle_error(self, failue, item, spider):print(failue)

④爬虫的具体业务代码(二.36氪网站分析)已经给出了主要的部分,如何把提取的数据存到item里,自行学习一下吧,很简单,上述代码也只是我根据自己的业务需要写的,爬取的方法我觉得说的挺明白了,爬取到的数据具体怎么处理,各位根据自己的情况写代码吧。

Python+scrapy爬取36氪网相关推荐

  1. Python Scrapy 爬取煎蛋网妹子图实例(一)

    前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...

  2. 基于python多线程和Scrapy爬取链家网房价成交信息

    文章目录 知识背景 Scrapy- spider 爬虫框架 SQLite数据库 python多线程 爬取流程详解 爬取房价信息 封装数据库类,方便多线程操作 数据库插入操作 构建爬虫爬取数据 基于百度 ...

  3. python selenium爬取去哪儿网的酒店信息——详细步骤及代码实现

    目录 准备工作 一.webdriver部分 二.定位到新页面 三.提取酒店信息 ??这里要注意?? 四.输出结果 五.全部代码 准备工作 1.pip install selenium 2.配置浏览器驱 ...

  4. python爬虫图片实例-Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  5. Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  6. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  7. Python 数据采集-爬取学校官网新闻标题与链接(基础)

    Python 爬虫爬取学校官网新闻标题与链接 一.前言 二.扩展库简要介绍 01 urllib 库 (1)urllib.request.urlopen() 02 BeautifulSoup 库 (1) ...

  8. Scrapy爬取1908电影网电影数据

    Scrapy爬取1908电影网电影数据 最初是打算直接从豆瓣上爬电影数据的,但编写完一直出现403错误,查了查是豆瓣反爬虫导致了,加了headers也还是一直出现错误,无奈只能转战1908电影网了. ...

  9. python爬虫爬取彼岸图网图片

    python爬虫爬取彼岸图网图片 话不多说,直接上代码! import requests from PIL import Image from io import BytesIO import re ...

最新文章

  1. ASP.NET 状态管理概述(MSDN)
  2. 编译原理词/语法分析
  3. 〖前端开发〗HTML/CSS基础知识学习笔记
  4. [学习笔记]上下界网络流
  5. avr flash_AVR | USART家庭自动化
  6. 学习opencv3_如何高效学习计算机视觉?
  7. Adobe illustrator 调整对象大小 - 连载 11
  8. python 列表的增删改查操做1125 元组 的查操做
  9. MySQL引擎类型(三)
  10. java类型强转会有性能消耗吗_Java代码性能优化总结(转)
  11. 计算机usb速度设置,怎样提升USB2.0的速度 注册列表修改法【详解】
  12. STM32串行驱动LCD12864显示屏程序代码
  13. iptable的安全设置
  14. win7需要计算机管理员权限,解决方案:Win7安装软件需要管理员权限解决方案
  15. vijos P1263 单挑女飞贼
  16. 喝酒游戏,概率分布和卷积
  17. 数据库查询语句(书上例题)
  18. JSF标签详解(全)
  19. 坯子库无法一键安装插件没用_坯子库插件集下载-坯子插件库下载v2020.1 官方最新版-西西软件下载...
  20. 视频号跳转商品页面的教程

热门文章

  1. access h3c交换机光口_H3C交换机常用配置命令转载
  2. B站视频CC字幕提取和转换方法
  3. python导出dxf图,使用Python操作CAD的dxf文件,批量绘制变形图的方法记录
  4. DFS与BFS的区别、用法、详解?
  5. 数据仓库架构以及数据模型的设计
  6. 华为1+X网络系统建设与运维(中级)—— 视频讲解汇总目录
  7. truncate表后恢复方法总结
  8. 8.7 Kuratowski定理
  9. 什么是区块链,区块链又是什么?
  10. [Luogu P2447] [BZOJ 1923] [SDOI2010]外星千足虫