引言:

昨天在网易云课堂自学了《Python网络爬虫实战》,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐!

另外,在网上看到一位学友整理的课程记录,非常详细,可以优先参考学习。传送门:请点击

本篇文章是自己同步跟着视频学习的记录,欢迎阅读~~~

实验:新浪新闻首页爬虫实践

http://news.sina.com.cn/china/

一、准备

  • 浏览器内建的开发人员工具(以Chrome为例)

  • Python3 requests 库

  • Python3 BeautifulSoup4 库(注意,BeautifulSoup4和BeautifulSoup是不一样的)

  • jupyter notebook

二、抓取前的分析

以Chrome为例,抓取前的分析步骤如图:

  1. F12进入到开发者工具;
  2. 点击Network
  3. 刷新页面;(按F5)
  4. 找到Doc
  5. 找到左边Name这一栏的第一个(需要爬去的链接90%的情况都是第一个);
  6. 点击右边的Headers
  7. 找到请求的URL和请求方式。

三、开始撰写第一只网络爬虫

Requests库

  • 网络资源撷取套件
  • 改善Urllib2的缺点,让使用者以最简单的方式获取网络资源
  • 可以使用REST操作存取网络资源

jupyter

使用jupyter来抓取网页并打印在浏览器中,再按Ctrl-F查找对应的内容,以确定我们要爬去的内容在该网页中。

测试示例:

 import requests
res = requests.get('http://www.sina.com.cn/')
res.encoding = 'utf-8'
print(res.text)

四、用BeautifulSoup4剖析网页元素

测试示例:

 from bs4 import BeautifulSoup
html_sample = ' \
<html> \
<body> \
<h1 id="title">Hello World</h1> \
<a href="#" class="link">This is link1</a> \
<a href="# link2" class="link">This is link2</a> \
</body> \
</html>' soup = BeautifulSoup(html_sample, 'lxml')
print(soup.text)

五、BeautifulSoup基础操作

使用select找出含有h1标签的元素

soup = BeautifulSoup(html_sample)
header = soup.select('h1')
print(header)
print(header[0])
print(header[0].text)

使用select找出含有a的标签

soup = BeautifulSoup(html_sample, 'lxml')
alink = soup.select('a')
print(alink)
for link in alink:
print(link)
print(link.txt)

使用select找出所有id为title的元素(id前面需要加#)

alink = soup.select('#title')
print(alink)

使用select找出所有class为link的元素(class前面需要加.)

soup = BeautifulSoup(html_sample)
for link in soup.select('.link'):
print(link)

使用select找出所有a tag的href链接

alinks = soup.select('a')
for link in alinks:
print(link['href']) # 原理:会把标签的属性包装成字典

六、观察如何抓取新浪新闻信息

关键在于寻找CSS定位

  • Chrome开发人员工具(进入开发人员工具后,左上角点选元素观测,就可以看到了)

    Chrome寻找元素定位.png

  • Firefox开发人员工具
  • InfoLite(需翻墙)

七、制作新浪新闻网络爬虫

抓取时间、标题、内容

import requests
from bs4 import BeautifulSoup res = requests.get('http://news.sina.com.cn/china')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'lxml') for news in soup.select('.news-item'):
if (len(news.select('h2')) > 0):
h2 = news.select('h2')[0].text
time = news.select('.time')[0].text
a = news.select('a')[0]['href']
print(time, h2, a)

抓取新闻内文页面

新闻网址为:http://news.sina.com.cn/o/2017-12-06/doc-ifypnyqi1126795.shtml

内文资料信息说明图.png

获取新闻内文标题、时间、来源

其中涉及时间和字符串转换

from datetime import datetime

// 字符串转时间 --- strptime
dt = datetime.strptime(timesource, '%Y年%m月%d日%H:%M') // 时间转字符串 --- strftime
dt.strftime(%Y-%m-%d)

整理新闻内文、获取编辑名称

整理新闻内文步骤:

1、抓取;

2、获取段落;

3、去掉最后一行的编辑者信息;

4、去掉空格;

5、将空格替换成\n,这里可以自行替换成各种其他形式;

最终简写为一句话。

抓取新闻评论数

解释:

评论是是通过JS代码传过来的;既然是JS,那么通过AJAX传过来的概率很高,于是点到XHR中看,但是发现Response中没有出现总评论数2然后就只能去JS里面了,地毯式搜索,找哪个Response里出现了总评论数2,终于找到了。

找到链接和请求方式

今天补的截图,评论数实时增加,请不要觉得奇怪 ^_^

然后就可以撸码了。

解释:

var data={......}看着很像是个json串,去掉var data=,使其变为json串。

可以看到,jd串中就是评论的信息了。

回到Chrome开发工具中,浏览评论数量。

获取新闻标识符(新闻ID)

方式1:切割法

# 取得新闻编号
newsurl = 'http://news.sina.com.cn/o/2017-12-06/doc-ifypnyqi1126795.shtml'
newsid = newsurl.split('/')[-1].rstrip('.shtml').lstrip('doc-i')
newsid

方式2:正则表达式

import re
m = re.search('doc-i(.*).shtml', newsurl)
newsid = m.group(1)
newsid

八、建立获取评论数函数

做一个总整理,把刚刚取得评论数的方法整理成一个函数。之后有新闻网页的链接丢进来,可以通过这个函式去取得它的总评论数。

九、建立新闻内文信息抽取函数

十、从列表链接中取出每篇新闻内容

如果Doc下面没有我们想要找的东西,那么就有理由怀疑,这个网页产生资料的方式,是通过非同步的方式产生的。因此需要去XHRJS下面去找。

有时候会发现非同步方式的资料XHR下没有,而是在JS下面。这是因为这些资料会被JS的函式包装,Chrome的开发者工具认为这是JS文件,因此就放到了JS下面。

JS中找到我们感兴趣的资料,然后点击Preview预览,如果确定是我们要找的,就可以去Headers中查看Request URLRequest Method了。

一般JS中的第一个可能就是我们要找的,要特别留意第一个。

1、选择Network标签

2、点选JS

3、找到页面链接page=2

处理分页链接

注意头尾,需要去掉头和尾,将其变成标准的json格式。

十一、建立剖析清单链接函数

将前面的步骤整理一下,封装到一个函式中。

def parseListLinks(url):
newsdetails = []
res = requests.get(url)
jd = json.loads(res.text.lstrip('newsloadercallback()').rstrip(');'))
for ent in jd['result']['data']:
newsdetails.append(getNewsDetail(ent['url']))
return newsdetails

十二、使用for循环产生多页链接

十三、批次抓取每页新闻内文

十四、 使用pandas整理数据

Python for Data Analysis

  • 源于R
  • Table-Like格式
  • 提供高效能、简易使用的资料格式(Data Frame)让使用者可以快速操作及分析资料

十五、保存数据到数据库

持续战斗到这里,第一只网络爬虫终于完成。看着最终的结果,很有成就感啊!^_^

大家感兴趣的可以试一试,欢迎讨论交流~~~

如果觉得文章有用,请随手点赞,感谢大家的支持!

特别赠送:GitHub代码传送门

感谢大家耐心地阅读,如果能对大家有一点点帮助,欢迎点亮我的GitHub星标,谢谢~~~

Python爬虫学习记录【内附代码、详细步骤】的更多相关文章

  1. python爬虫学习记录

    爬虫基础 urllib,urllib2,re都是python自带的模块 urllib,urllib2区别是urllib2可以接受一个Request类的实例来设置url请求的headers,即可以模拟浏 ...

  2. python爬虫学习记录——各种软件/库的安装

    Ubuntu18.04安装python3-pip 1.apt-get update更新源 2,ubuntu18.04默认安装了python3,但是pip没有安装,安装命令:apt install py ...

  3. Python入门学习指南--内附学习框架

    https://blog.csdn.net/weixin_44558127/article/details/86527360

  4. Python 爬虫的工具列表 附Github代码下载链接

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  5. Python爬虫个人记录(二) 获取fishc 课件下载链接

    参考: Python爬虫个人记录(一)豆瓣250 (2017.9.6更新,通过cookie模拟登陆方法,已成功实现下载文件功能!!) 一.目的分析 获取http://bbs.fishc.com/for ...

  6. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  7. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

  8. Python爬虫学习:二、爬虫的初步尝试

    我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...

  9. python爬虫学习笔记(一)——环境配置(windows系统)

    在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库)   [推荐地址:清华镜像] https://mirrors ...

随机推荐

  1. 使用SUI框架下的<a>标签点击跳转页面不刷新的问题

    最近写好了几个页面,今天试着将各个页面的链接打通,然后问题就来了...(╯︵╰) 这里看一下原来想要实现的两个页面跳转的效果--点击图一标注的栏目可以跳转到一个新的页面图二... 按照之前写a标签的跳 ...

  2. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  3. (转)MySQL登陆后提示符的修改

    MySQL登陆后提示符的修改 方法一:mysql命令行修改方式 mysql>prompt \u@night \r:\m:\s-> PROMPT set to '\u@night \r:\m ...

  4. Java之IO(零)总结

    转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...

  5. TCP与UDP的差别以及TCP三次握手、四次挥手

    UDP: 1.UDP面向报文,无需建立连接,不可靠,数量小,高层就解决差错重传,无需拥塞控制 2.支持音频.视频传输 3.检查和检验UDP包头和数据和伪首部 4.分组开销小(头部8个字节),提供最大努 ...

  6. 第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库

    SpringBoot+SpringData+Jpa进行查询修改数据库 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分.但它又不限于EJB 3.0,你可以在Web应用.甚至桌面应用 ...

  7. GridSearchCV

    GridSearchCV 简介: GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果.这个 ...

  8. MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

    在项目开启阶段,其中一个很重要的环节就是选架构. 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题!   下面我就在这里梳理一下目前常见的一些架构模式. 先逐个对它们的分析 ...

  9. Week6&7——第一次项目冲刺(Alpha版本)

    Deadline: 2017-11-11 10:00PM,以博客发表日期为准. 评分基准: 按时交 - 有分(需求&原型改进与系统设计-10分,敏捷冲刺-70分),检查的项目包括后文的三个方面 ...

  10. [CQOI 2018]交错序列

    Description 题库链接 定义长度为 \(n\) 的"交错序列"为:长度为 \(n\) 序列中仅含 \(0,1\) 且没有相邻的 \(1\) .给出 \(a,b\) ,假设 ...