前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫入门经典(八) | 使用xpath_爬取股吧

爬虫入门经典(八) | 使用xpath_爬取股吧

作者头像
不温卜火
发布2020-10-29 14:15:05
7180
发布2020-10-29 14:15:05
举报
文章被收录于专栏:不温卜火不温卜火

giao!连续用了正则爬取了两个网站。博主表示是抗拒的。所以本次博主任性的选择了用xpath爬取股吧的相关信息。

一、lxml语法的简单回顾

4
4
5
5
6
6
7
7

二、网页的简单分析

咳咳,爬取网站信息,没有网址可怎么行呢?安排: http://guba.eastmoney.com/ 在打开网页之后,我们发现界面是这样的

8
8

通过查看页面,我们可以看到标红部分就是我们准备爬取的内容。当然了,在进行页面解析之前,我们还有一件事情要做。我们既然要爬取内容,就不可能只爬取一页内容对吧。我们先来分析下每一页之间有没有关联,首先我们看下后几页

代码语言:javascript
复制
https://guba.eastmoney.com/default,99_2.html
https://guba.eastmoney.com/default,99_3.html
https://guba.eastmoney.com/default,99_4.html

以此,我们判断出第一页是不是

代码语言:javascript
复制
https://guba.eastmoney.com/default,99_1.html

我们可以验证下

9
9

?,我们的猜想是正确的。因此,我们知道我们需要刚开始的链接分别为

代码语言:javascript
复制
base_url = "http://guba.eastmoney.com/"
start_url = "http://guba.eastmoney.com/default,99_1.html"

三、主体部分分析及解析提取

打开开发者选项,我们可以看到对应的关系

11
11

这个时候,我们的思路应该是通过xpath先把我们所要解析的单个主提先提取出来,然后循环提取、追加。

代码语言:javascript
复制
html_obj = etree.HTML(html)
# 使用xpath语法提取
li_list = html_obj.xpath('//ul[@class="newlist"]/li')
print(li_list)
print(len(li_list))
12
12

从上图我们可以看到我们已经获取了所有的<li></li>标签。下面就是把他们每个比如阅读、评论等这些分别提取出来。

  • 1.阅读
13
13
  • 2.评论
14
14
  • 3.标题
15
15
  • 4.URL
16
16
  • 5.作者
17
17
  • 6.更新时间
18
18

分析完成!下面就可以看下代码实现了:

代码语言:javascript
复制
            item = {}
            item["read"] = li.xpath("./cite[1]/text()")[0].strip()
            item["comment"] = li.xpath("./cite[2]/text()")[0].strip()
            item["name"] = li.xpath("./span/a[1]/text()")[0]
            if li.xpath("./span/a[2]"):
                item["title"] = li.xpath("./span/a[2]/text()")[0]
            else:
                item["title"] = ""
            if li.xpath("./span/a[2]/@href"):
                item["url"] = self.base_url + li.xpath("./span/a[2]/@href")[0]
            else:
                item["url"] = ""
            item["author"] = li.xpath("./cite[3]/a/font/text()")[0]
            item["date"] = li.xpath("./cite[4]/text()")[0].strip()
            items.append(item)

			print(items)
20
20

我们可以看到我们得到的结果是正确的。至于为什么上面添加的有判断语句,是因为每个网站都有其反爬手段,这里博主直接给出了完整代码。如果有感兴趣的童鞋,可以把判断语句去掉,自行查看验证,并修改。这样可以增强记忆。

好了,内容方面已经解析完成,下面我们就需要梳理翻页的思路了。

我们通过上面的分析

代码语言:javascript
复制
https://guba.eastmoney.com/default,99_1.html
https://guba.eastmoney.com/default,99_2.html
https://guba.eastmoney.com/default,99_3.html
https://guba.eastmoney.com/default,99_4.html

可以看到每一页之间都是有联系的,每一页的网址也只是变动了一个数字而已,并且我们通过查看网页,发现网页也只有12页,因此我们可以这样完成模拟

代码语言:javascript
复制
start_url = "http://guba.eastmoney.com/default,99_{}.html"

for i in range(1,13):
    # 获取url
    pageLink = start_url.format(i)
    print(pageLink)
22
22

不过博主在此给出的是另一种写法

通过这种解析方式可以自动获取下一页的网址

23
23

通过这样,我们只需通过拼接就可以达到每一页的网址

代码语言:javascript
复制
        #提取下一页
        next_url = html_obj.xpath('//a[contains(text(),"下一页")]/@href')
        if next_url:
            next_url = self.base_url + next_url[0]
            print(next_url)

四、完整代码

代码语言:javascript
复制
# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-07 9:20
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 爬股吧.py
  @Version:1.0
  
'''
import requests
import re
import time
import random
from lxml import etree


class Spider:
    def __init__(self):
        self.base_url = "http://guba.eastmoney.com/"
        self.start_url = "http://guba.eastmoney.com/default,99_1.html"
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
        }
        self.items = []
        self.index = 1

    def get_content(self, url):
        """获取url对应的内容"""
        time.sleep(random.random()*3)
        response = requests.get(url=url, headers=self.headers)
        return response.content.decode("utf-8")

    def parse_html(self, html):
        """解析html获取数据"""
        # 解析html
        html_obj = etree.HTML(html)
        # 使用xpath语法提取
        li_list = html_obj.xpath('//ul[@class="newlist"]/li')
        # 循环
        for li in li_list:
            print(self.index)
            item = {}
            item["read"] = li.xpath("./cite[1]/text()")[0].strip()
            item["comment"] = li.xpath("./cite[2]/text()")[0].strip()
            item["name"] = li.xpath("./span/a[1]/text()")[0]
            if li.xpath("./span/a[2]"):
                item["title"] = li.xpath("./span/a[2]/text()")[0]
            else:
                item["title"] = ""
            if li.xpath("./span/a[2]/@href"):
                item["url"] = self.base_url + li.xpath("./span/a[2]/@href")[0]
            else:
                item["url"] = ""
            item["author"] = li.xpath("./cite[3]/a/font/text()")[0]
            item["date"] = li.xpath("./cite[4]/text()")[0].strip()
            self.items.append(item)
            self.index+=1

        #提取下一页
        next_url = html_obj.xpath('//a[contains(text(),"下一页")]/@href')
        if next_url:
            next_url = self.base_url + next_url[0]
            html = self.get_content(next_url)
            self.parse_html(html)

    def save(self):
        """保存"""
        with open("./股吧.txt", "a", encoding="utf-8") as file:
            for item in self.items:
                file.write(",".join(item.values()))
                file.write("\n")

    def start(self):
        print("爬虫开始...")
        self.parse_html(self.get_content(self.start_url))
        print("爬虫结束...")
        print("保存开始...")
        self.save()
        print("保存结束...")


if __name__ == '__main__':
    Spider().start()

五、保存成功截图

24
24

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、lxml语法的简单回顾
  • 二、网页的简单分析
  • 三、主体部分分析及解析提取
  • 四、完整代码
  • 五、保存成功截图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档