一个简单爬虫的入门教程

article/2025/9/10 19:09:08

前言

我毕业论文要写文本大数据情绪分析,没有现成的数据。淘宝要价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 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费


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

相关文章

python爬虫入门教程:开始一个简单的爬虫

本文下面所有的Python基础都有详细的配套教程以及源码&#xff0c;都已经打包好上传到百度云了&#xff0c;链接在文章结尾处&#xff01; 扫码此处领取大家自行获取即可~~~ 1.爬虫的过程分析 当人类去访问一个网页时&#xff0c;是如何进行的&#xff1f;   ①打开浏览器&…

从原理到实战,一份详实的 Scrapy 爬虫教程

之前分享了很多 requests 、selenium 的 Python 爬虫文章&#xff0c;本文将从原理到实战带领大家入门另一个强大的框架 Scrapy。如果对Scrapy感兴趣的话&#xff0c;不妨跟随本文动手做一遍&#xff01; 一、Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕…

超级简单的Python爬虫教程,python爬虫菜鸟教程官网

毫无基础的人如何入门 Python ? Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言&#xff0c;比如非常难学的C语言&#xff0c;非常流行的Java语言&#xff0c;适合初学者的Basic语言&#xff0c;适合网页编程的JavaScript语言等等。 那Python是一种…

爬虫教程(1)基础入门

爬虫介绍 网络爬虫&#xff0c;英译为 web crawler &#xff0c;是一种自动化程序&#xff0c;现在我们很幸运&#xff0c;生处互联网时代&#xff0c;有大量的信息在网络上都可以查得到&#xff0c;但是有时我们需要网络上的数据&#xff0c;活着文章&#xff0c;图片等等&…

爬虫的简单入门

本文旨在教会读者能够简单使用两种爬虫&#xff0c;完成一些基础的爬虫操作&#xff0c;会给出一些优化思路&#xff0c;并不会深入的讲解优化方法。 目录 前言 一、爬虫部分——网页源码获取 1、Requests 2、Selenium 二、数据处理——解析网页 BeautifulSoup 三、成功入门之后…

网页爬虫教程

转自https://morvanzhou.github.io/tutorials/data-manipulation/scraping/ 了解网页结构 学习爬虫, 首先要懂的是网页. 支撑起各种光鲜亮丽的网页的不是别的, 全都是一些代码. 这种代码我们称之为 HTML, HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览…

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

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

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

初识爬虫 学习爬虫之前&#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;代码不复杂首先…