• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
JUNECODE
Talk is cheap, show me the code.
博客园    首页    新随笔    联系   管理    订阅  订阅
实例学习——爬取简书网热评文章
简书网热评爬虫实战

近来学习多线程爬虫,发现书上关于爬取简书网热评文章的代码因网页更改问题运行有误,在此修正。

开发环境:(Windows)eclipse+pydev+MongoDB

爬取网址:传送门

1、手动浏览网页,发现没有分页的界面,可判断该网站采用了异步加载技术。

2、查看网页源代码,通过观察源代码Network处Headers的URL,发现只需改变page后的页数即可获得不同的页面。

(爬取内容:用户名、标题、内容、评论数、点赞数、打赏数)

3、连接数据库(见本人其余博文,不再赘述)

代码:

# _*_ coding:utf-8 _*_

import requests 
import pymongo
from multiprocessing import Pool
from lxml import etree

client = pymongo.MongoClient('localhost',27017)     #连接数据库
mydb = client['mydb']                               #创建数据库
jianshu_shouye =mydb['jianshu_shouye']              #创建集合

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}

def get_jianshu_info(url):
    html = requests.get(url,headers = headers)         #获取页面请求
    selector = etree.HTML(html.text)                   #分析返回文本
    infos = selector.xpath('//ul[@class="note-list"]/li')   #观察源代码三角标,可得循环点
    
    for info in infos : 
        try:
            author = info.xpath('div/div/a/text()')[0]
            title = info.xpath('div/a/text()')[0]              
            content = info.xpath('div/p/text()')[0].strip()           
            comment = info.xpath('div/div/a[2]/text()')[1].strip()        
            like = info.xpath('div/div/span[1]/text()')[0]        
            rewards = info.xpath('div/div/span[2]/text()')
            if len(rewards) == 0:
                reward = '无'
            else:
                reward = rewards[0].strip()
            
            data = {
                'author':author,
                'title':title,
                'content':content,
                'comment':comment,
                'like':like,
                'reward':reward
                }
            jianshu_shouye.insert_one(data)
        except IndexError:
            pass
        
if __name__=='__main__':
    urls = ['https://www.jianshu.com/c/bDHhpK?order_by=added_at&page={}'.format(str(i)) for i in range(1,10001)]
    pool = Pool(processes = 4)      #创建进程池
    pool.map(get_jianshu_info, urls)

#所谓循环点即爬取区域每一小段的完整信息标签(其上没有再囊括其的三角标)

运行Robomongo查看数据存储情况:

posted on 2019-09-19 17:14  JUNECODE  阅读(349)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3