美文网首页
Python爬取豆瓣电子小说

Python爬取豆瓣电子小说

作者: Treehl | 来源:发表于2017-10-24 19:56 被阅读0次

    准备工作

    安装BeautifulSoup模块

    pip install BeautifulSoup4
    

    BeautifulSoup4 文档

    第一步:分析网页

    登陆https://read.douban.com/kind/100打开Chrome开发者工具(F12),如下图所示:


    我们得到如下信息
    • 小说列表在页面位置为class属性为item store-itemul标签中
    • 小说信息在ul标签下的li标签中

    第二步:使用requets下载网页源码

    import requests
    
    download_url = 'https://read.douban.com/kind/100'
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
        }
    
    def download_page(url):
        data = requests.get(url, headers=headers).content
        return data
    
    def main():
        url = download_url
        print download_page(download_url)
    
    if __name__ == '__main__':
        main()
    

    简单测试下,运行后得到的结果

    <!DOCTYPE html><html lang="zh-CN" class="ua-windows ua-chrome ua-chrome61 ua-webkit is-anonymous" ><head><meta charset="utf-8"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Expires" content="Sun, 6 Mar 2005 01:00:00 GMT"><meta name="google-site-verification" content="Wyui6dsg_StZ9K3rJ6xtsNbxPhELyhMkEp2MsAhviBQ"><meta property="weixin:image"  ...............................
    

    上面的代码中User-Agent将创建请求的浏览器和用户代理名称等信息传递给服务器,服务器通过校验请求的U-A来识别爬虫,这算是最简单的一种反爬虫机制了。
    在开发者功能(F12)的Network中我们可以找到U-A

    当我们拿到网页源码之后,就需要解析HTML源码了。这里,我们使用BeautifulSoup来搞定这件事。

    1.from bs4 import BeautifulSoup
    2.def parse_html(html):
    3.  soup = BeautifulSoup(html, 'html.parser')
    4.  read_list_soup = soup.find('ul', attrs={'class': 'list-lined ebook-list  column-list'})
    5.  for read_li in read_list_soup.find_all('li', attrs={'class': 'item store-7.
    item'}):
    6.        detail = read_li.find('div', attrs={'class': 'title'})
    7.        read_name = detail.find('a').getText()
    8.        print read_name
    

    现在我们解析下代码

    1. 导入模块
    2. 定义parse_html函数,它接受html源码作为输入,并将这个网页中的小说名称打印到控制台
    3. 使用BeautifulSoup解析网页
    4. 这是网页html源码定位到的小说列表元素
    5. 使用for循环解析每个li标签
      6、7都是解析小说名字

    到这里我们得到了小说的名称,接下来我们需要解析翻页的元素

    第三步:定位下一页链接


    依旧使用开发者工具(F12),我们找到了下一页元素在li标签中的classnext,链接则在a标签中,到了最后一页之后,这个li中的a标签消失了,就不需要再翻页了
    代码如下:
    def parse_html(html):
        soup = BeautifulSoup(html, 'html.parser')
        read_list_soup = soup.find('ul', attrs={'class': 'list-lined ebook-list column-list'})
    
        read_name_list = []
    
        for read_li in read_list_soup.find_all('li', attrs={'class': 'item store-item'}):
            detail = read_li.find('div', attrs={'class': 'title'})
            read_name = detail.find('a').getText()
            read_name_list.append(read_name)
    
        next_page = soup.find('li', attrs={'class': 'next'}).find('a')
        if next_page:
            return read_name_list, download_url + next_page['href']
        return read_name_list, None
    

    在解析html之后取回我们需要的数据,next_page到最后一页就返回None

    第四步:使用codecs处理中文编码

    def main():
        url = download_url
    
        with codecs.open('readings', 'wb', encoding='utf-8') as f:
            while url:
                html = download_page(url)
                readings, url = parse_html(html)
                f.write(u'{readings}\n'.format(readings='\n'.join(readings)))
    

    程序运行完之后,所有的小说名称全部写入了readings中

    完整代码
    欢迎访问我的博客Treehl的博客

    相关文章

      网友评论

          本文标题:Python爬取豆瓣电子小说

          本文链接:https://www.haomeiwen.com/subject/qtixpxtx.html