一个简单的爬虫入门教程!

article/2025/9/10 19:45:55

前言

我毕业论文要写文本大数据情绪分析,没有现成的数据。淘宝要价600块我又舍不得,只能自学爬虫。我一点计算机网络的基础都没有,光是入门就花了一周(不知道从何下手),所幸爬虫不难,只要见过就能会用。

所以写个文章把这个爬虫分享出来。

我的需求

我要爬取[雪球网]的股票评论信息(如图),看起来很简单。

基础知识

URL

开发人员工具DevTools

你还需要知道浏览器中 F12 或 右键菜单-检查 是开发人员工具DevTools,现在就可以试试。在Edge DevTools的欢迎页面中有一个好心的链接“DevTools为初学者”,里面也可以学习html,但是中文翻译有点问题。

打开DevTools的"元素"面板可以看到当前网页的html代码(这个说法其实不准确)。打开DevTools的"网络"面板可以看到有哪些网络请求。这两个面板后面会用到。

HTTP请求过程

打开[必应 (bing.com)]网页,打开DevTools"网络"面板,刷新页面,你会看到许多请求。

第一个是“?mkt=zh-CN”,如果你看了URL介绍,可能会记得问号后面是“提供给网络服务器的额外参数”(知道是参数就行)。状态码是200 (ok),一切正常。常用的还有 403 forbidden 和 404 not found。

点击“?mkt=zh-CN”可以看到请求(标)头和响应头。HTTP请求是由客户端发出的消息,用来使服务器执行动作。做爬虫也是给服务器发请求(头)。

HTTP消息只看请求头和响应头部分:

请求头中的每一行含义见下链接(可以不看):

HTTP 请求方法有8种,我们只要用到 GET 方法:

Cookie

HTTP Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。

有些网站需要登录才能完整访问,而cookie可以保持登录状态。后面写爬虫需要把 cookie 复制保存在本地。

HTML, CSS, Javascript

[HTML](HyperText Markup Language) 不是一门编程语言,而是一种用来告知浏览器如何组织页面的标记语言。HTML 可复杂、可简单,一切取决于开发者。它由一系列的**元素([elements])**组成,这些元素可以用来包围不同部分的内容,使其以某种方式呈现或者工作。 一对标签([tags])可以为一段文字或者一张图片添加超链接,将文字设置为斜体,改变字号,等等。

层叠样式表 [CSS]:HTML用于定义内容的结构和语义,CSS用于设计风格和布局。比如,您可以使用CSS来更改内容的字体、颜色、大小、间距,将内容分为多列,或者添加动画及其他的装饰效果。

[JavaScript] 编程语言允许你在 Web 页面上实现复杂的功能。如果你看到一个网页不仅仅显示静态的信息,而是显示依时间更新的内容,或者交互式地图,或者 2D/3D 动画图像,或者滚动的视频播放器,等等——你基本可以确定,这需要 JavaScript 的参与。

Requests

这是个python包,我会把需要用到的用法写出来。

实现GET请求

> import requests
> url = 'https://www.httpbin.org/get'
> response = requests.get(url)
> print(response.status_code)
> print(response.text)200
{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.26.0", "X-Amzn-Trace-Id": "Root=1-61ea5106-6a65650b1eff1121063b27ac"}, "origin": "110.255.126.198", "url": "https://www.httpbin.org/get"
}

可以看到返回结果中包含请求头、URL、IP等信息

用Cookie维持登录状态

打开[Scrape | Movie],这个网站需要登录才能访问,用户名和密码都是admin。如果我们直接发送get请求,只能得到登录界面,你可以试试。

> url = 'https://login2.scrape.center/'
> response = requests.get(url)
> print(response.text)

需要使用cookie才行。我们先手动登录,打开DevTools的"网络"面板,点击第一个出现的请求"login2.scrape.center",在请求头中找到cookie并手动复制。

> url = 'https://login2.scrape.center/'
> headers = {'cookie':'UM_distinctid=17e10d0b5b2f35-00090e3f71d56b-4c607a68-240000-17e10d0b5b3fbd; sessionid=i86q0uab3zunw8rj4n10oqvuhvswnzrn'}
> response = requests.get(url,headers=headers)
> print(response.text)

fake_useragent

UserAgent 用户代理,相当于浏览器的身份证号,是请求头中的一行。在利用爬虫爬取网站数据时,频繁更换它可以避免触发相应的反爬机制。
fake_useragent 包可以用来生成UserAgent,用法很简单。

> from fake_useragent import UserAgent
> ua = UserAgent()
> headers = {
>   'user-Agent':ua.random,
>   'cookie':'your cookie'
> }
> response = requests.get(url,headers=headers)

时间戳 timestamp

时间戳,一串数字,代表从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数(有时精确到毫秒或微秒)

> import time
> time.time()
1642747138.7392855

tqdm

tqdm是用来生成进度条的包,我看的是这个教程:

其实只需要这个示例

> from tqdm import tqdm
> dic = ['a', 'b', 'c', 'd', 'e']
> pbar = tqdm(dic)
> for i in pbar:
>     pbar.set_description('Processing '+i)
>     time.sleep(0.2)Processing e: 100%|██████████| 5/5 [00:01<00:00,  4.69it/s]

存储数据的一种方式:JSON文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。示例如下:

{"employees": [{ "firstName":"John" , "lastName":"Doe" },{ "firstName":"Anna" , "lastName":"Smith" },{ "firstName":"Peter" , "lastName":"Jones" }]
}

存储数据的另一种方式:MongoDb数据库

NoSQL,非关系型的数据库,有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。Mongodb是其中一种。

在官网选择合适的版本

打开安装程序,选择 complete 完全安装,在 Service Configuration 界面选择 Run Service as Network Service user。其他不管。

在浏览器地址栏输入 localhost:27017,安装成功应该出现 “It looks like you are trying to access MongoDB over HTTP on the native driver port.”

通过pymongo包使用数据库,

> import pymongo
> client = pymongo.MongoClient(host='localhost',port=27017) # 连接数据库
> client.list_database_names() #查看已有的数据库
> db = client.test # 创建名为 text 的数据库
> db.list_collection_names() #查看已有的集合,MongoDB 中的集合类似 SQL 的表。
> collection = db.comments # 创建名为 comments 的集合
> # 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。> data = { "name": "Duang", "university": "SWUFE"}
> collection.insert_one(data) # 插入数据> result = collection.find_one({ "name": "Duang"}) # 查询数据
> print(result)
{'_id': ObjectId('61ea7d5b92328b1dc5121a0f'), 'name': 'Duang', 'university': 'SWUFE'}> collection.delete_one({ "name": "Duang"}) # 删除数据
<pymongo.results.DeleteResult at 0x17ec7f263c0>

爬虫代码

我已经发在 github,自取

导入包

没什么好说的。

import requests
import logging
from fake_useragent import UserAgent
from datetime import datetime
from datetime import timedelta
#from tqdm.notebook import tqdm #如果用jupyter则从这里导入
from tqdm import tqdm
import pymongo

不可更改部分

logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://xueqiu.com/query/v1/symbol/search/status.json?count=10&comment=0&symbol={symbol}&hl=0&source=user&sort={sort}&page={page}&q=&type=11'
client = pymongo.MongoClient(host='localhost',port=27017)
#client.list_database_names() #查看已有的数据库
db = client.test
#db.list_collection_names() #查看已有的集合
collection = db.comments

实际上 db = client.test 也可以改成别的名字。

可更改部分

sort = 'time' # 时间排序
#sort = 'alpha'# 热度排序
eduSHcode=['SH600880','SZ002261','SZ300282',
'SZ300359','SZ300010','SZ300192','SZ002659',
'SH600636','SZ300688','SZ300338','SH603377',
'SZ002621','SH605098','SZ003032','SZ002841',
'SH600661','SH600730','SZ002638','SZ002607',
'SZ300089','SZ000526'] # 股票代码
keys = {'fav_count','hot','id','like_count',
'text','timeBefore','view_count','user_id'} # 需要的数据类型
maxPage=10 # 最大为100

eduSHcode 是股票代码,我直接手动复制粘贴了。

maxPage 是爬取评论的页数,每页十条,最大为100页(雪球规定的)。

生成HTML请求头

def make_headers(cookie_path='cookie.txt'):# 生成HTML请求头ua = UserAgent()headers = {'user-Agent':ua.random,'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','cache-control': 'no-cache','pragma': 'no-cache','sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="97", "Chromium";v="97"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'none','sec-fetch-user': '?1','upgrade-insecure-requests': '1'}with open(cookie_path,"r") as f:cookie = f.read()headers['cookie'] = cookiereturn(headers)headers = make_headers()

请求头里的内容都可以去DevTools"网络"面板看,如果不一样可以自己改。

在文件夹里新建个 cookie.txt,把 cookie 值复制进去。

几个主要的函数

但是没啥可讲的

def scrape_api(url):# 根据url爬取网页,是最基础的函数try:response = requests.get(url,headers=headers)if response.status_code == 200:return response.json()except requests.RequestException:logging.error('error occurred while scraping %s', url, exc_info=True)def scrape_symbol(symbol):# 爬取股票信息for page in tqdm(range(1, maxPage + 1), desc='Page',leave=False):url = INDEX_URL.format(symbol=symbol, page=page, sort=sort) # 将url中空缺的信息填上index_data = scrape_api(url)save_data_mongodb(index_data)def save_data_mongodb(index_data):# 输入为一页十条评论,分别保存about = index_data.get('about')for comment_data in index_data.get('list'):# 先处理时间格式if 'timeBefore' in comment_data.keys():thetime = str(comment_data['timeBefore'])comment_data['timeBefore'] = parse_time(thetime)# 好像bool值不能直接保存if 'hot' in comment_data.keys():comment_data['hot'] = str(comment_data['hot'])# 提取需要的信息result_data = {key:value for key,value in comment_data.items() if key in keys }result_data['symbol'] = about#保存collection.insert_one(result_data)def parse_time(thetime):# 此函数抄自: https://github.com/py-bin/xueqiu_spider# 稍有修改# 处理爬取时间格式异常问题,如“今天 08:30”、“20分钟前”date_now = datetime.now()if '今天' in thetime:rst = thetime.replace('今天',date_now.strftime('%Y-%m-%d'))elif '昨天' in thetime:the_time = date_now - timedelta(days=1)rst = thetime.replace('昨天',the_time.strftime('%Y-%m-%d'))elif '分钟前' in thetime:the_min = int(thetime[:-3])the_time = date_now - timedelta(minutes=the_min)rst = the_time.strftime('%Y-%m-%d %H:%M')elif '秒前' in thetime:rst = date_now.strftime('%Y-%m-%d %H:%M')elif len(thetime)== 11:rst = str(date_now.year) + '-' + thetimeelse:rst = thetimereturn rst

最后是 main 函数

def main():pbar = tqdm(eduSHcode) # 进度条for symbol in pbar:pbar.set_description('Processing '+symbol)scrape_symbol(symbol)print('OK')if __name__ == '__main__':main()

追加的需求

我还需要获取股票的历史数据(虽然很容易下载到),在网页上选择区间统计,近三年,得到请求URL

https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=SZ002607&begin=1548166870391&end=1642774867690&period=day&type=before&indicator=kline

可以看到一次请求就获得所有三年的数据

URL 中有三项需要我们自己该,分别是:

  • symbol=SZ002607
  • begin=1548166870391
  • end=1642774867690

symbol 是股票代码,begin 和 end 是起止时间,观察规律+上网搜索得知,这个时间就是 Unix 时间戳,精确到毫秒。尝试发现其后四位(秒)不影响请求结果。

在之前爬虫的基础上改动如下:

更换URL

DATA_URL = 'https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol={symbol}&begin={begin}&end={end}&period=day&type=before&indicator=kline'

生成时间戳

now = datetime.now()
end = int(time.mktime(now.timetuple()))*1000 # *1000 是从秒变毫秒
three_years_ago = now - timedelta(days=365*years)
begin = int(time.mktime(three_years_ago.timetuple()))*1000

两个函数(因为只要一次请求所以不用反复循环)

def scrape_num_symbol(symbol):# 爬取股票数据url = DATA_URL.format(symbol=symbol,begin=begin,end=end) # 将url中空缺的信息填上index_data = scrape_api(url)return index_datadef save_numdata_mongodb(index_data):about = index_data['data']['symbol']keys = index_data['data']['column']pbar = tqdm(index_data['data']['item'],leave=False)for data in pbar:pbar.set_description('saving timestamp '+str(data[0]))result_data = dict(zip(keys,data))result_data['symbol'] = aboutcollection.insert_one(result_data)

至此结束

如果你也想学习Python爬虫的话,这里给大家分享一份Python爬虫学习资料和公开课, 里面的内容都是适合零基础小白的笔记和资料,超多实战案例,不懂编程也能听懂、看懂。需要的话扫描下方二维码免费获得,让我们一起学习!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝朋友们如果有需要的话,可以扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓


http://chatgpt.dhexx.cn/article/wStUOmud.shtml

相关文章

【爬虫教程】吐血整理,最详细的爬虫入门教程~

初识爬虫 学习爬虫之前&#xff0c;我们首先得了解什么是爬虫。 来自于百度百科的解释&#xff1a; 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&a…

爬虫教程( 1 ) --- 初级、基础、实践

爬虫教程&#xff1a;https://piaosanlang.gitbooks.io/spiders/content/ 1. 爬虫入门 初级篇 IDE 选择&#xff1a; PyCharm (推荐) 、SublimeText3、Visual Studio Python 版本&#xff1a;Python3。&#xff08; 最简单的是直接安装 Anaconda&#xff0c;使用 Anaconda 管理…

python 爬虫 简单爬虫教程(requests + selenium )

最近改了实验室之前的爬虫&#xff0c;感觉有些生疏了&#xff0c;故此记录一下&#xff0c; 我将会通过抓取网站 https://nonfungible.com/ 来进行讲解。 目录 requests Chrome 浏览器使用Chrome 对目标网站信息进行解析requests get 请求requests 添加头requests ip代理 使用…

如何自学Python爬虫?详细的从入门到精通Python爬虫技能教程来了

如何自学Python爬虫&#xff1f;在大家自学爬虫之前要解决两个常见的问题&#xff0c;一是爬虫到底是什么&#xff1f;二是问什么要用Python来做爬虫&#xff1f;爬虫其实就是自动抓取页面信息的网络机器人&#xff0c;至于用Python做爬虫的原因&#xff0c;当然还是为了方便。…

Python爬虫入门教程:超级简单的Python爬虫教程

这是一篇详细介绍 [Python] 爬虫入门的教程&#xff0c;从实战出发&#xff0c;适合初学者。读者只需在阅读过程紧跟文章思路&#xff0c;理清相应的实现代码&#xff0c;30 分钟即可学会编写简单的 Python 爬虫。 这篇 Python 爬虫教程主要讲解以下 5 部分内容&#xff1a; …

python超简单爬虫教程

python超简单爬虫教程 python超简单爬虫教程七大步骤&#xff1a;1发送数据请求2请求网站源码3数据筛选4存储数据5数据可视化6数据分析7公司决策 python超简单爬虫教程 大家好&#xff01;在这里给大家交流一下小编总结得python超简单爬虫教程&#xff0c;废话不多说&#xff…

如何入门 Python 爬虫?详细教程在这里

根据本人的习惯与理解&#xff0c;用最简洁的表述&#xff0c;介绍爬虫的定义、组成部分、爬取流程&#xff0c;并讲解示例代码。 基础 爬虫的定义&#xff1a;定向抓取互联网内容&#xff08;大部分为网页&#xff09;、并进行自动化数据处理的程序。主要用于对松散的海量信…

爬虫入门教程 —— 1

爬虫入门教程 -1 很想做一些爬虫的基础性的教程&#xff0c;来与大家共同分享我的一些小经验&#xff0c; 我将以我认为的方式为大家讲解网络爬虫&#xff0c;如果你没有编程基础&#xff0c;对网络爬虫有兴趣&#xff0c;开始可能稍微有一些小难度&#xff0c;不过我希望能给…

Python爬虫简单入门教程

这篇 Python 爬虫教程主要讲解以下 5 部分 了解网页结构&#xff1b;使用 requests 库抓取网站数据&#xff1b;使用 Beautiful Soup 解析网页&#xff1b;清洗和组织数据&#xff1b;爬虫攻防战&#xff1b; 了解网页结构 网页一般由三部分组成&#xff0c;分别是 HTML&#…

Python网络爬虫使用教程

文章目录 一、URL资源抓取1.urllib2.requests3.requests-html二、正则表达式三、数据解析1.Beautiful Soup2.lxml3.selectolax四、自动化爬虫selenium五、爬虫框架1.Scrapy2.pyspider框架六、模拟登录与验证码识别七、autoscraper&#xff08;不需要编程基础&#xff09; 一、U…

爬虫入门教程

文章目录 前言一、学习爬虫前所需掌握的内容二、爬取数据2.1 如何存储数据2.2 获取html网络数据2.3 获取json网络数据2.4 获取图片数据 三、提取数据3.1 提取百度热搜信息3.2 提取豆瓣同城近期活动信息 前言 第一次接触爬虫&#xff0c;这篇博客用于记录学习的过程&#xff0c…

「爬虫教程」吐血整理,最详细的爬虫入门教程

初识爬虫 学习爬虫之前&#xff0c;我们首先得了解什么是爬虫。来自于百度百科的解释&#xff1a; 网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&…

Python爬虫之入门保姆级教程,学不会我去你家刷厕所

注重版权&#xff0c;转载请注明原作者和原文链接作者&#xff1a;Bald programmer 今天这个教程采用最简单的爬虫方法&#xff0c;适合小白新手入门&#xff0c;代码不复杂 文章目录 今天这个教程采用最简单的爬虫方法&#xff0c;适合小白新手入门&#xff0c;代码不复杂首先…

Java单元测试使用mock【转载】

1、什么是Mock? mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象的行为。比如说你需要调用B服务&#xff0c;可是B服务还没有开发完成&#xff0c;那么你就可以将调用B服务的那部分给Mock掉&#xff0c;并编写你想要的返…

Java代码实现单元测试

单元测试&#xff1a;在编写java代码的时候&#xff0c;如果我们想去运行一个Java程序&#xff0c;那么必须创建一个main方法&#xff0c;但这样比较麻烦 比如现在我们想去测试HDFS的JavaAPI的文件上传和文件下载功能 如果使用main方法的话&#xff0c;那么我们需要创建两个J…

java单元测试(@Test)

初学者在写java代码的时候&#xff0c;可能会因为写一个小功能就要写一个类&#xff0c;写一个main方法而苦恼。其实java的工程师在很早的时候就提供了解决的方案。就是我们今天要讲 的Junit测试。 在使用的时候首先需要配置环境&#xff1a; 一、英文&#xff1a; 选中一个…

java单元测试方法的使用

单元测试方法的使用 java单元测试是最小的功能单位测试代码&#xff0c;我们在编写大型程序的时候&#xff0c;需要写成千上万个方法或函数&#xff0c;这些函数的功能可能很强大&#xff0c;但我们在程序中只用到该函数的一小部分功能&#xff0c;如果想要测试这些方法函数的…

java单元测试的编写及运行方法

java单元测试的方法 1、为什么要进行单元测试 因为单元测试相当于测试的某个功能点&#xff0c;不是针对整个业务进行的测试&#xff0c;例如如果只想调试某个类下的功能&#xff0c;但又想把多个类写在一个java文件里&#xff0c;就可以采用单元测试的方法 2、怎么创建及运…

Java单元测试框架 - JUnit

导航 我们为什么需要单元测试框架&#xff1f;为工程添加JUnit支持编写JUnit单元测试案例JUnit常用注解JUnit常用断言JUnit案例Spring整合 我们为什么需要单元测试框架&#xff1f; 当我们需要对一段代码进行测试时&#xff0c;怎么样让他快速跑起来呢&#xff1f;一个很自然的…

java单元测试之mock篇

java单元测试之mock篇 一、什么是mock&#xff1f;二、为什么要进行mock&#xff1f;三、IDEA中使用Mock3.1、引入mock所需依赖3.1、IDEA单元测试必备快捷键3.2、Mock测试相关注解Mock注解InjectMocks注解调用PowerMockito.spy()方法Mock使用方式或者技巧静态方法mockStaticPre…