Python学习之路(爬虫基础)
前两部分已经更新了python我认为一些比较难以区分开来的数据类型已经针对excel及csv文件的操作,在涉及到神经网络训练亦或是数学建模中,前面所提到的两部分往往至关重要。数据格式不清晰操作不正确或者是不懂得如何处理excel文件,在前期数据预处理的部分往往会耗费大量的时间和精力,而且往往debug后知其然而不知所以然。因此,爬虫这部分往往能够将这部分串起来。
(笔者本身不是计算机专业出身,现今读研更是于计算机专业差得十万八千里,研究方向在CV这块,由于太卷了只能是另辟蹊径,所以只能从基础的部分打起)
(下面的部分参考自----零基础学Python爬虫、数据分析与可视化从入门到精通孟兵 李杰臣 编著ISBN:978-7-111-66899-2)(只做笔记摘录的部分,有需要的同学可以上书店买)
1.在谷歌浏览器中使用百度搜索引擎搜索“当当”,然后按【F12】键或按快捷键【Shift+Ctrl+I】,即可打开开发者工具,界面如下图所示。此时窗口的上半部分显示的是网页,下半部分默认显示的是“Elements”选项卡,该选项卡中的内容就是网页源代码。源代码中被“<>”括起来的文本称为Elements对象或网页元素,我们需要提取的数据就存放在这些Elements对象中。
1. 网页结构的组成
pycharm生成:
下面就来介绍一些常用的HTML标签
(1)div标签
(2).ul标签
(3).h标签
还有许多其他的标签作用(我把图片贴在下面,具体可以再搜索)
2.静态网页和动态网页的区别
我这只能做一个大概的解释,在打开浏览器网页按F12间之后跳出代码界面点击network之后,点刷新,上方xrr按钮点一下,会跳出一个界面。界面的左边是name,右边的分区为数据包的部分,在滑动界面的滚动条,如果实时刷新的话代表动态界面,需要不断地访问去获得信息,而没有更新则是静态界面,访问一次即可。
下面是动态界面访问代码(豆瓣动漫)
import requests
import json
url = 'https://movie.douban.com/j/chart/top_list'
params = {'type': '25', 'interval_id': '100:90', 'action': '', 'start': '0', 'limit': '164'}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400'}
#User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400
response = requests.get(url=url, params=params, headers=headers)
content = response.json()
for i in content:print(json.dumps(i, indent=4, ensure_ascii=False, separators=(', ', ': ')))break
with open('豆瓣电影动画排行榜.txt', 'w', encoding = 'utf-8') as fp:for i in content:title = i['title']score = i['score']fp.write(title + ' ' + score + '\n')
再此基础上整一个复杂一点的,当当网的访问。
import requests
import pandas as pd
from bs4 import BeautifulSoup# 设置请求头部信息,模拟浏览器发送请求
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}# 创建一个字典用于存储图书信息
data_info = {'图书排名': [], '图书名称': [], '图书作者': [], '图书出版时间': [], '图书出版社': [], '图书价格': []}# 解析HTML内容,提取图书信息并存入data_info字典
def parse_html(soup):li_list = soup.select('.bang_list li') # 使用CSS选择器选取所有具有类名为'bang_list'的li元素for li in li_list:# 提取图书信息并存入data_info字典对应的字段中data_info['图书排名'].append(li.select('.list_num ')[0].text.replace('.', ''))data_info['图书名称'].append(li.select('.name a')[0].text)data_info['图书作者'].append(li.select('.publisher_info ')[0].select('a')[0].text)data_info['图书出版时间'].append(li.select('.publisher_info span')[0].text)data_info['图书出版社'].append(li.select('.publisher_info ')[1].select('a')[0].text)data_info['图书价格'].append(float(li.select('.price .price_n')[0].text.replace('¥', '')))# 遍历页码,发送请求并解析HTML内容
for i in range(1, 3):# 构建URLurl = f'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent30-0-0-1-{i}'# 发送GET请求,获取HTML内容response = requests.get(url=url, headers=headers, timeout=10)html_content = response.text# 使用BeautifulSoup解析HTML内容soup = BeautifulSoup(html_content, 'lxml')# 解析HTML内容,提取图书信息parse_html(soup)print(f'第{i}页爬取完毕')# 将data_info字典转换为DataFrame对象
book_info = pd.DataFrame(data_info)# 打印是否存在缺失值
print(book_info.isnull())# 打印是否存在重复数据
print(book_info.duplicated())# 将图书价格大于100的值设为None,并删除包含缺失值的行
book_info['图书价格'][book_info['图书价格'] > 100] = None
book_info = book_info.dropna()# 将数据保存为CSV文件
book_info.to_csv('当当网图书销售排行.csv', encoding='utf-8', index=False)
Chatgpt解释:
这段代码是一个简单的爬虫程序,用于爬取当当网图书销售排行榜的数据,并将结果保存为CSV文件。
首先,它导入了需要的库,包括requests
用于发送HTTP请求,pandas
用于数据处理,以及BeautifulSoup
用于解析HTML内容。
接下来,定义了一个名为headers
的字典,用于设置请求头部信息,模拟浏览器发送请求。
然后,创建了一个名为data_info
的空字典,用于存储爬取的数据。该字典包含了图书排名、图书名称、图书作者、图书出版时间、图书出版社和图书价格等字段。
接着,定义了一个名为parse_html
的函数,用于解析HTML内容并将数据存入data_info
字典中。函数首先使用CSS选择器选取所有具有类名为bang_list
的li
元素,然后依次遍历每个元素,从中提取图书的相关信息,并将信息存入data_info
字典对应的字段中。
在主程序部分,使用一个循环遍历页码,从第1页到第2页,构建对应的URL。然后,使用requests
库发送GET请求,获取网页的HTML内容。接着,使用BeautifulSoup
解析HTML内容,得到一个BeautifulSoup对象soup
。然后,调用parse_html
函数解析soup
,将数据存入data_info
字典中,并打印爬取完成的消息。
接下来,将data_info
字典转换为pandas
的DataFrame对象book_info
,然后调用isnull()
方法打印出是否存在缺失值的情况,调用duplicated()
方法打印出是否存在重复数据的情况。
然后,对于book_info
中的'图书价格'
列,将大于100的值设为None
,即将价格大于100的图书的价格置空。然后,调用dropna()
方法删除包含缺失值的行。
最后,使用to_csv()
方法将book_info
保存为CSV文件,文件名为当当网图书销售排行.csv
,编码方式为UTF-8,且不保存索引信息。
请注意,该代码在爬取过程中使用了HTTP请求头部信息,模拟了浏览器的请求,以防止被目标网站识别为爬虫程序。
Header组成部分:
headers
是一个包含HTTP请求头部信息的字典。在这段代码中,headers
被用于设置请求头部信息,模拟浏览器发送请求。
HTTP请求头部包含了客户端(例如浏览器)发送给服务器的附加信息,用于描述请求或者请求中的内容。常见的请求头部信息包括User-Agent
、Accept
、Content-Type
等。
在这段代码中,headers
字典中的User-Agent
字段指定了浏览器的用户代理信息,用于模拟浏览器发送请求。通过设置合适的用户代理信息,可以使请求看起来像是由真实的浏览器发送的,而不是爬虫程序发送的。
具体来说,User-Agent
字段的值是一个字符串,表示浏览器的标识信息。在这个例子中,User-Agent
的值是Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
,它表示一个基于Chrome浏览器的用户代理信息。
通过设置合适的User-Agent
,可以避免被目标网站识别为爬虫程序,提高爬取数据的成功率。这是因为某些网站可能会对不符合常规浏览器标识的请求进行限制或阻止,通过设置合理的User-Agent
可以绕过这些限制。
总之,headers
字典中的User-Agent
字段用于在发送请求时设置请求头部中的用户代理信息,以模拟浏览器发送请求。
HTML的组成:
HTML(Hypertext Markup Language)是用于创建网页的标准标记语言。它由一系列标签(Tags)组成,这些标签用于定义网页的结构和内容。以下是HTML中的一些重要的组成部分:
-
标签(Tags):HTML中的标签是用尖括号包围的元素,用于表示不同类型的内容和结构。标签通常是成对出现的,包括一个开始标签和一个结束标签。开始标签用来定义元素的开始,结束标签用来定义元素的结束。例如,
<h1>
和</h1>
是标题元素的开始和结束标签。 -
元素(Elements):元素是由开始标签、内容和结束标签组成的整体,用于定义网页中的不同部分。元素包含在标签中,例如
<h1>这是一个标题</h1>
,其中<h1>
是开始标签,</h1>
是结束标签,而这是一个标题
是元素的内容。 -
属性(Attributes):属性提供了有关元素的额外信息。属性包含在开始标签中,由属性名和属性值组成。属性名和属性值之间使用等号连接。例如,在
<img>
标签中,src
和alt
就是两个常用的属性,用于指定图像的源文件和替代文本。 -
文本内容(Text Content):HTML中的文本内容是指出现在标签中的可见文本。它可以是普通的文本,也可以是链接、段落、标题等。文本内容可以直接写在元素内部,也可以通过属性或子元素进行设置。
-
嵌套关系(Nesting):HTML允许元素相互嵌套,即一个元素包含在另一个元素内部。通过嵌套,可以创建出层次结构丰富的网页。例如,
<div>
元素可以包含多个其他元素,形成一个块级容器。 -
注释(Comments):注释是在HTML代码中添加的一种说明文本,用于对代码进行注释或提供说明。注释不会在浏览器中显示,只是给开发人员阅读和理解代码时使用。
这些是HTML中的一些重要的组成部分。HTML的结构和语法规则决定了网页的布局、样式和交互行为。开发人员使用HTML来描述网页的结构和内容,通过与CSS(层叠样式表)和JavaScript等技术的结合,可以实现丰富多样的网页功能和交互效果。
Div内部元素:
<div>
是HTML中的一个常用的块级元素,用于创建一个容器,可以包含其他HTML元素。<div>
本身并没有特定的含义或语义,它主要用于在网页中创建一个逻辑上的分组或容器,方便对其内部的元素进行样式化或布局。
<div>
元素可以包含各种其他HTML元素,例如文本、图像、链接、表格、表单等。它可以用于创建网页的各个部分,如页眉、导航栏、侧边栏、主内容区域等。
以下是一些常见的元素,可以包含在<div>
元素内部:
- 文本内容(Text Content):可以直接在
<div>
内部添加文本内容,例如段落(<p>
)、标题(<h1>
-<h6>
)等。 - 图像(Image):使用
<img>
标签可以在<div>
内部插入图像。 - 链接(Link):使用
<a>
标签可以在<div>
内部创建链接到其他页面或资源的链接。 - 列表(List):使用有序列表(
<ol>
)、无序列表(<ul>
)和列表项(<li>
)来创建项目列表。 - 表格(Table):使用
<table>
、<tr>
和<td>
等标签可以在<div>
内部创建表格。 - 表单(Form):使用
<form>
标签可以在<div>
内部创建表单,包括输入字段、按钮等。 - 其他HTML元素:除了上述常见元素外,还可以包含其他HTML元素,如视频(
<video>
)、音频(<audio>
)、嵌入式内容(<iframe>
)等。
通过将这些元素放置在<div>
内部,可以组织和管理网页的结构和内容,同时可以方便地应用样式和布局。在CSS中,可以通过选择器选择<div>
元素,并对其内部的元素应用样式。
需要注意的是,<div>
仅仅是一个通用的容器元素,不具备特定的语义。如果要为特定的内容或功能选择更合适的HTML元素,应该优先考虑使用具有语义的元素,以提高网页的可访问性和可理解性。