参考原文:

分为五个模块:主模块、URL管理器、下载器、解析器、输出器。

主模块首先调用URL管理器管理URL,接着将URL传给下载器,下载器发送请求到URL并得到响应数据,本例中除了第一次请求之外,再次请求时需要发送两个参数到服务器,将响应数据传给解析器解析出真正需要的数据,再将数据交给输出器输出。

这里爬取的是简书的新上榜文章 http://www.jianshu.com/recommendations/notes,当滑到底部点击"加载更多"时,会向服务器发送一个GET请求,可以使用火狐开发者浏览器查看,点击 网络->XHR,会新出来一个GET请求 :

点击之前

点击之后

点击这个GET请求,查看请求URL、请求参数以及响应数据:

请求网址

请求参数

响应数据

查看源码可以观察到max_id其实是上次请求的返回数据中最后一个文章的data-recommended-at的值再减去1。

而另一个参数data-category-id的值由图中可知。

也就是说第一次访问简书的“新上榜”文章时,可以直接访问网址 http://www.jianshu.com/recommendations/notes,当需要加载更多数据时,需要解析上次请求来的响应数据,我们可以使用BeautifulSoup第三方库解析html得到需要的数据。

这里我安装了anaconda2第三方库,python解析器使用anaconda2。

jianshu.py:

#!/Users/xiaoka/anaconda2/bin/python

# coding: utf-8

import urllib2

from bs4 import BeautifulSoup

class Splider:

def __init__(self):

self.manager = Manager()

self.downloader = Download()

self.parser = Parse()

self.outputer = Output()

def craw_search_word(self, root_url):

count = 0

self.manager.add_new_url(root_url)

while self.manager.has_new_url():

try:

if count >= 10000:

break

print "正在加载第" + str(count) + "到" + str(count + 15) + "条数据"

current_url = self.manager.get_new_url()

html_content = self.downloader.download(current_url)

new_url, data = self.parser.parse(root_url, html_content)

self.manager.add_new_url(new_url)

# self.outputer.collect(data)

self.outputer.output(data)

count += 15

except urllib2.URLError, e:

if hasattr(e, "reason"):

print "craw faild, reason: " + e.reason

class Manager(object):

def __init__(self):

self.new_urls = set()

self.old_urls = set()

def add_new_url(self, new_url):

if new_url is None:

return None

elif new_url not in self.new_urls and new_url not in self.old_urls:

self.new_urls.add(new_url)

def has_new_url(self):

return len(self.new_urls) != 0

def get_new_url(self):

new_url = self.new_urls.pop()

self.old_urls.add(new_url)

return new_url

class Download(object):

def download(self, url):

if url is None:

return None

headers = {

"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0",

"Cookie" : "Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1466075280; __utma=194070582.826403744.1466075281.1466075281.1466075281.1; __utmv=194070582.|2=User%20Type=Visitor=1; signin_redirect=http%3A%2F%2Fwww.jianshu.com%2Fsearch%3Fq%3D%25E7%2594%259F%25E6%25B4%25BB%26page%3D1%26type%3Dnote; _session_id=ajBLb3h5SDArK05NdDY2V0xyUTNpQ1ZCZjNOdEhvNUNicmY0b0NtMnVuUUdkRno2emEyaFNTT3pKWTVkb3ZKT1dvbTU2c3c0VGlGS0wvUExrVW1wbkg1cDZSUTFMVVprbTJ2aXhTcTdHN2lEdnhMRUNkM1FuaW1vdFpNTDFsQXgwQlNjUnVRczhPd2FQM2sveGJCbDVpQUVWN1ZPYW1paUpVakhDbFVPbEVNRWZzUXh5R1d0LzE2RkRnc0lJSHJEOWtnaVM1ZE1yMkt5VC90K2tkeGJQMlVOQnB1Rmx2TFpxamtDQnlSakxrS1lxS0hONXZnZEx0bDR5c2w4Mm5lMitESTBidWE4NTBGNldiZXVQSjhjTGNCeGFOUlpESk9lMlJUTDVibjNBUHdDeVEzMGNaRGlwYkg5bHhNeUxJUVF2N3hYb3p5QzVNTDB4dU4zODljdExnPT0tLU81TTZybUc3MC9BZkltRDBiTEsvU2c9PQ%3D%3D--096a8e4707e00b06b996e8722a58e25aa5117ee9; CNZZDATA1258679142=1544596149-1486533130-https%253A%252F%252Fwww.baidu.com%252F%7C1486561790; _ga=GA1.2.826403744.1466075281; _gat=1",

"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"

}

content = ""

try:

request = urllib2.Request(url, headers = headers)

response = urllib2.urlopen(request)

content = response.read()

except urllib2.URLError, e:

if hasattr(e, "reason") and hasattr(e, "code"):

print e.code

print e.reason

else:

print "请求失败"

return content

class Parse(object):

def get_new_data(self, root_url, ul):

data = set()

lis = ul.find_all("li", {"class" : "have-img"})

for li in lis:

cont = li.find("div", {"class" : "content"})

title = cont.find("a", {"class" : "title"}).get_text()

title_url = root_url + cont.a["href"]

data.add((title, title_url))

return data

def get_new_url(self, root_url, ul):

lis = ul.find_all("li", {"class" : "have-img"})

data_category_id = ul["data-category-id"]

# 最后一个文章data-recommended-at -1

max_id = int(lis[-1]["data-recommended-at"]) - 1

new_url = root_url + "?data_category_id=" + data_category_id + "&max_id=" + str(max_id)

return new_url

def parse(self, root_url, content):

soup = BeautifulSoup(content, "html.parser", from_encoding="utf-8")

div = soup.find(id="list-container")

ul = div.find("ul", {"class" : "note-list"})

new_url = self.get_new_url(root_url, ul)

new_data = self.get_new_data(root_url, ul)

return new_url, new_data

class Output(object):

def __init__(self):

self.datas = set()

def collect(self, data):

if data is None:

return None

for item in data:

if item is None or item in self.datas:

continue

self.datas.add(item)

def output(self, data):

for item in data:

title, url = item

print title + " " + url

if __name__ == "__main__":

root_url = "http://www.jianshu.com/recommendations/notes"

splider = Splider()

splider.craw_search_word(root_url)

赋予jianshu.py执行权限后,终端执行./jianshu.py。

python2.7爬虫实例-Python2.7爬虫-爬取简书文章-入门相关推荐

  1. selenium+python爬取简书文章

    页面加载逻辑 当你兴致勃勃地从网上学习了基本的爬虫知识后就像找个目标实践下,拥有大量文章的简书包含了大量的有价值信息,所以自然成为了你的选择目标,如果你尝试之后会发现并没有想象的那么简单,因为里面包含 ...

  2. python爬虫——爬取简书文章

    这段时间在做的事情需要从网上获得一点资讯类似文章啊.电影啊.新闻啊等等,看了很久感觉用简书这个网址来做爬虫相对来说简单一点,可以不需要设置登录啥的就能够获取到内容,相比较起来已经很容易了. (一)分析 ...

  3. python爬取大众点评数据_python爬虫实例详细介绍之爬取大众点评的数据

    python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python ...

  4. 爬虫练习-爬取简书网热评文章

    前言: 使用多进程爬虫方法爬取简书网热评文章,并将爬取的数据存储于MongoDB数据库中 本文为整理代码,梳理思路,验证代码有效性--2020.1.17 环境: Python3(Anaconda3) ...

  5. 基于python爬虫的论文标题_Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】...

    本文实例讲述了Python3实现爬取简书首页文章标题和文章链接的方法.分享给大家供大家参考,具体如下: from urllib import request from bs4 import Beaut ...

  6. Node爬取简书首页文章

    Node爬取简书首页文章 博主刚学node,打算写个爬虫练练手,这次的爬虫目标是简书的首页文章 流程分析 使用superagent发送http请求到服务端,获取HTML文本 用cheerio解析获得的 ...

  7. 简书推荐作者风云榜(爬取简书app数据)

    一.前言 自处女作<爬取张佳玮138w+知乎关注者:数据可视化>一文分布后,来简书快一个月了(20170831).但一直不怎么熟悉这个平台,因此,这回爬取简书app里的推荐作者并进行简单可 ...

  8. python 简书_python爬取简书网文章的方法

    python爬取简书网文章的方法 发布时间:2020-06-30 14:37:08 来源:亿速云 阅读:100 作者:清晨 这篇文章主要介绍python爬取简书网文章的方法,文中示例代码介绍的非常详细 ...

  9. 简书python_使用 Python 爬取简书网的所有文章

    01 抓取目标 我们要爬取的目标是「 简书网 」. 打开简书网的首页,随手点击一篇文章进入到详情页面. 我们要爬取的数据有:作者.头像.发布时间.文章 ID 以及文章内容. 02 准备工作 在编写爬虫 ...

最新文章

  1. python编程在哪里写-python入门该从哪里开始?
  2. 【网上的都不靠谱?还是得改源码】用Javasisst的字节码插桩技术,彻底解决Gson转Map时,Int变成double问题...
  3. Codeforces Round #515 (Div. 3)【未完结】
  4. javax.net.ssl.SSLException: Received fatal alert: protocol_version问题解决
  5. ACNet论文阅读笔记
  6. 支付宝pc支付php,laravel框架下的pc支付宝支付接入
  7. java 方法 示例_带有示例的Java EnumSetSupplementOf()方法
  8. AI应用开发实战系列之一: 从零开始配置环境
  9. ASP.NET 2.0中将 GridView 导出到 Excel 文件中 (转)
  10. 麦克纳姆轮辊子滚动速度分析
  11. 2018,程序员要搭配这40条编程箴言!!!条条都是干货
  12. 机载激光雷达原理与应用科普(二)
  13. 【转】一起做RGB-D SLAM (1)
  14. 工欲善其事必先利其器–SimpleTestBed
  15. 工具类源码 IP辅助类 验证IP地址或地址段是否有效 验证指定的IP是否有效 即验证IP是否属于某个IP段
  16. Excel引用外部数据链接地址修改/引用地址修改/公式更改
  17. p2p 企业信贷 UML 跨行清算
  18. virtio网络Data Plane卸载原理——vhost protocol
  19. 站长说说之SEO让流量翻倍的策略分享
  20. 科普:什么是图灵机?

热门文章

  1. ggplot2设置坐标轴范围_R可视化03|ggplot2图层-几何对象图层(geom layer)
  2. 基于命令序列的异常行为分析 业界研究现状分析
  3. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...
  4. elasticsearch 路由文档到分片
  5. Node初学(二)Promise/Deferred模式,异步调用
  6. C#网页数据采集(一)HtmlAgilityPack
  7. Lodop中特殊符号¥打印设计和预览不同
  8. 【操作系统】进程间通信
  9. xshell 上传 下载文件
  10. 文本框字符串长度实时统计jQuery插件,兼容IE6+