使用Python爬取gitbook.cn中的热门chat

准备工作

  • Python 3.5
  • macOS 10.13.4
  • 使用Google Chrome浏览器
  • 使用PyCharm 2018.1.2 (Professional Edition)
  • 爬取的网站gitChat
  • chromedriver 下载
  • chromedriver与chrome各版本对应

分析网页

要抓取的网页视图.png
相应的HTML代码.png

分析html代码并找到我们需要的数据,这里我把数据所在的标签的层级关系用下图表示:


标签分析图.png

在这里我们要抓取chat的名称、chat介绍的连接、chat的头像连接以及chat作者的名字。在上图中黑色标签所代表的相应属性和内容就是我们想要获取的数据。好了,分析完之后下面我们开始编写代码。

# 这是需要用到的库
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import lxml
import json

这些库可以在PyCharm中PyCharm-->Preferences-->Project Setting-->Project Interpreter 中左下角点击'+'号进行搜索自己需要的库并进行安装
我们需要编写一个Class,命名为GetChat,用于获取HTML网页并进行网页的解析,这里解析使用lxml库

class GetChat():
    def __init__(self):
        self.web_url = 'http://gitbook.cn/gitchat/hot'
        self.headers = {'User-Agent':
                            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) '
                            'AppleWebKit/537.36 (KHTML, like Gecko) '
                            'Chrome/66.0.3359.139 Safari/537.36'
                        }
        self.dataList = []

    #这里暂时用不到该方法
    def request(self, web_url):
        r = requests.get(web_url, header=self.headers)
        return r

    def spider(self):
        print('开始获取网页,请稍等...')
        driver = webdriver.Chrome('/Users/Pro-007/Desktop/chromedriver')
        driver.get(self.web_url)
        html = driver.page_source

        all_div = BeautifulSoup(html, 'lxml').find_all('div', class_='col-md-12')
        for div in all_div:
            chat_div = div.find('div', class_='mazi-item')
            chat_a = chat_div.find('a')
            chat_url = chat_a.get('href')
            chat_url_final = 'http://gitbook.cn' + chat_url  # 获取完整的chat_url
            item_name = chat_a.find('div', class_='item-name-cardV2')
            profile_photo_url = item_name.find('img')['src']
            chat_info = item_name.find('div', class_='item-author-ndV2')
            chat_name = chat_info.find('div', class_='item-titleV2').get_text()
            chat_author = chat_info.find('div', class_='item-author-nameV2').get_text()

            self.data_to_dict(chat_name, chat_author, profile_photo_url, chat_url_final)

        print('获取完成,本次共获取%s个数据' % len(self.dataList))
        data_json = json.dumps(self.dataList, indent=4)  #格式化成json数据
        print(data_json)

    #封装字典
    def data_to_dict(self, chat_name, author_name, profile_photo_url, chat_url):
        data_dict = {'chatName': chat_name,
                     'authorName': author_name,
                     'profilePhotoUrl': profile_photo_url,
                     'chatUrl': chat_url}
        self.dataList.append(data_dict)  #将字典装入数据列表

看到以上代码可知,我们的重点在于spider方法内,这个方法就是具体实现爬虫的代码,我们使用webdriver提供的方法获取网页,其中.Chrome()方法内填写你下载好的chromedriver的存放路径(无需安装),.get()用于请求网页。使用BeautifuSoup提供的方法进行网页HTML代码解析

是不是感觉进行HTML解析的时候解析代码有点多...
没办法啊(无奈)我也是初次自己写爬虫,Python还在学习中,所以有哪位大神有更精简的代码的话我们可以一起探讨以下(笑脸)~~~

好了,最后实例化一个对象并执行spider方法

getChat = GetChat()
getChat.spider()

我们可以看到控制台已经输出json化的数据啦


json化的数据.png

到这里我们已经基本完成热门chat的数据爬取了,为什么我说是基本完成了?(思考状...)
哈哈,难道没有发现我们只获取到了20条数据吗?为什么呢?原因是原网页一次只展现20条信息,其他的需要用户进行上拉刷新才能获取更多的信息,好吧,问题来了,那我们使用代码怎么体现用户上拉刷新的操作呢,这里我们就需要使用一个工具了Selenium,这是它的官网。有兴趣的可以提前去了解一下,我们下一篇文章使用要使用Selenium获取更多的数据

小结

1、代码目前不够精简,可读性有待提高。
2、关于爬虫,这是我这几天突然想到的,我要把chat数据爬出来,然后制作一个iOS端的应用,就是想着怎么把数据传到云端,然后使用APP进行数据访问

你可能感兴趣的:(使用Python爬取gitbook.cn中的热门chat)