爬取东方财富网股评
东方财富网白酒吧的股评
爬取东方财富网股吧中白酒吧的评论和时间,下面分享两种方法。
第一种方法
from lxml import etree
# lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML
# 利用etree.HTML()将html字符串转化为element对象
import requests
from fake_useragent import UserAgent
# 生成随机请求头,反爬
import time
# 延迟,设置时间延迟
import csv
f = open('../白酒.csv', 'a', encoding='utf-8-sig', newline="") # 创建文件对象
# 修改文件名;mode指定文件写入方式为a,表示数据追加,w表示覆盖原文本,newline表示消除空行
csv_write = csv.DictWriter(f, fieldnames=['title', 'date']) #列名为title和date
csv_write.writeheader() #写入一次表头数据
#设置两个空列表
all_title = []
all_date = []
for i in range(1,3): #这里爬取两页数据,刚开始爬取一页可以去掉循环
print('##################正在抓取第{}页的数据#######################'.format(i))
url = 'http://guba.eastmoney.com/list,bk0896,f_{}.html'.format(str(i))
#复制自己的url
headers = {
'User-Agent': UserAgent().random # #生成随机请求头
}
response = requests.get(url=url, headers=headers) #发送http请求,获取响应数据
html = etree.HTML(response.text) #数据解析,服务器渲染需要去html中提取到我们想要的东西
title = html.xpath('//div[contains(@class,"articleh normal_post")]/span[@class="l3 a3"]/a/text()')
#div下的class属性为articleh normal_post 的根元素span中的class属性为l3 a3的根元素为a的文本信息
date = html.xpath('//div[contains(@class,"articleh normal_post")]//span[@class="l5 a5"]//text()')
all_title += title
all_date += date
for title, date in zip(all_title, all_date):
data_dict = {'title': title, 'date': date}
csv_write.writerow(data_dict)
# 保存为一个csv文件
利用图片解释一下这部分代码可以更好的理解
title = html.xpath('//div[contains(@class,"articleh normal_post")]/span[@class="l3 a3"]/a/text()')
#div下的class属性为articleh normal_post 的根元素span中的class属性为l3 a3的根元素为a的文本信息

1.常用标签
div的定义和用法 *
定义
div是一个html标签元素,div默认是占一行的。
<div> 可定义文档中的分区或节(division/section)。
<div> 标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。
如果用 id 或 class 来标记 <div>,那么该标签的作用会变得更加有效。
用法
<div> 是一个块级元素。这意味着它的内容自动地开始一个新行。实际上,换行是 <div> 固有的唯一格式表现。可以通过 <div> 的 class 或 id 应用额外的样式。
不必为每一个 <div> 都加上类或 id,虽然这样做也有一定的好处。
可以对同一个 <div> 元素应用 class 或 id 属性,但是更常见的情况是只应用其中一种。这两者的主要差异是,class 用于元素组(类似的元素,或者可以理解为某一类元素),而 id 用于标识单独的唯一的元素。
span
span标签是一个行级元素,可以用span标签对文本文件设置一些非常基础的属性,例如大小等等
a
<a> 标签定义超链接,用于从一张页面链接到另一张页面。
<a> 元素最重要的属性是 href 属性,它指示链接的目标。
默认情况下,所有浏览器将按以下方式来显示链接:
未访问链接(unvisited link)是蓝色带下划线的
已访问链接(visited link)是紫色带下划线的
活动链接(active link)是红色带下划线的
ul和li
<ul> 标签定义无序列表。
将 <ul> 标签与 <li> 标签一起使用,创建无序列表。
<li> 标签定义列表项目。
<li> 标签可用在有序列表(<ol>)、无序列表(<ul>)和菜单列表(<menu>)中。
还有其他一些标签,可以在下面这个链接中查找
https://www.runoob.com/tags/tag-li.html
2.xpath的用法
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
| 表达式 | 描述 |
|---|---|
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
| . | 选取当前节点 |
| … | 选取当前节点的父节点 |
| @ | 选取属性 |
| l | 在两个中结点中选择 |
| () | 用()来包含l |
| * | 包含所有元素 |
| not | 取反 |
参考链接:<>
第二种方法
# 导入库
## 使用bs4进行爬取
import requests
from bs4 import BeautifulSoup #BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码
import csv
from fake_useragent import UserAgent
# 生成随机请求头,反爬
import time
# 延迟,设置时间延迟
file = open('白酒股评.csv', mode='w', encoding='utf-8-sig', newline='')
# mode指定文件写入方式为a,表示数据追加,newline消除空行,w表示覆盖原文本
csv_write = csv.DictWriter(file, fieldnames=[ '标题', '日期'])
csv_write.writeheader() #写入一次表头数据
headers = {
'User-Agent' : UserAgent().random
}
for i in range(1, 3):
print('##################正在抓取第{}页的数据#######################'.format(i))
url = 'http://guba.eastmoney.com/list,bk0896_{}.html'.format(str(i))
page_text = requests.get(url=url, headers=headers)
#解析数据
#1、把页面源代码交给BeautifulSoup进行处理,生成bs对象
soup = BeautifulSoup(page_text.text, "html.parser") #指定html解析器
#print(soup)
#2、从bs对象中查找数据
# find(标签,属性=值)
# find_all(标签,属性=值)
title = soup.find_all("span", class_='l3 a3')
date = soup.find_all("span", class_='l5 a5')
#print(title, time)
#score = soup.find_all("span",class_="rating_nums")
time.sleep(10) #延迟10秒,如果有时候循环比较多的时候会被拒绝爬取,则调高延迟的时间
for x, y in zip(title, date):
title = x.get_text().strip("\n /") #同时去掉左右两边的空格
date = y.get_text().strip("\n /")
data_dict = {'标题': title, '日期': date}
csv_write.writerow(data_dict)
# strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
BeatifulSoup4
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
# 'r':默认值,表示从文件读取数据。
#'w':表示要向文件写入数据,并截断以前的内容
#'a':表示要向文件写入数据,添加到当前内容尾部
#'r+':表示对文件进行可读写操作(删除以前的所有数据)
#'r+a':表示对文件可进行读写操作(添加到当前文件尾部)
#'b':表示要读写二进制数据
#'rb':是读取二进制文件
html = file.read()
bs = BeautifulSoup(html,"html.parser") # 缩进格式
print(bs.prettify()) # 格式化html结构
print(bs.title) # 获取title标签的名称
print(bs.title.name) # 获取title的name
print(bs.title.string) # 获取head标签的所有内容
print(bs.head)
print(bs.div) # 获取第一个div标签中的所有内容
print(bs.div["id"]) # 获取第一个div标签的id的值
print(bs.a)
print(bs.find_all("a")) # 获取所有的a标签
print(bs.find(id="u1")) # 获取id="u1"
for item in bs.find_all("a"):
print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"):
print(item.get_text())
- BeautifulSoup4四大对象种类
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
Tag
NavigableString
BeautifulSoup
Comment
如果还想继续学习关于BeatifulSoup4,可以参考链接:http://www.jsphp.net/python/show-24-214-1.html,这篇文章写的非常详细。
strip()
s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串。不能删除 中间的字符或是字符串。
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
序列解包
对于代码 for x, y in zip(title, date): 表示并行遍历
举个例子可以很清楚的理解
list_1 = [1, 2, 3]
list_2 = ['a', 'b', 'c']
for x, y in zip(list_1, list_2):
print(x, y)
# 输出结果
1 a
2 b
3 c
这部分内容分享结束,如果有错误,希望小可爱们批评指正。一起加油鸭!
Radiance~
