Advertisement

爬取东方财富网股评

阅读量:

东方财富网白酒吧的股评

爬取东方财富网股吧中白酒吧的评论和时间,下面分享两种方法。

第一种方法

复制代码
    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~

全部评论 (0)

还没有任何评论哟~