BeautifulSoup4 爬取AcFun文章区链接

作为一个内向的90后空巢老人一般都会逛逛弹幕网站。大二大三还会经常去混Billboard跟UK榜,大四了发现时间不够用了,B站还能去补补番,A站除了文章区是没别的逛了。So感悟说完了入正题,也是毕业设计的第一步工作,利用Python第三方模块BeautifulSoup4制作爬虫。
因为刚开始急功近利,没了解好Python就蠢蠢欲动就找爬虫教程,导致浪费了不少时间才发现网上大量存在的教程是基于Python2.7的,自己就对着3.5发愣…好吧不多说,进入正题之前巡礼先推荐我的参考资料,毕竟学习总得站在前人的基础才能更好的进步。

Python爬虫学习系列教程(我蠢蠢欲动之后就是看到这一篇,很全很详细,可只能怪自己连语法不同都不知道,不过学会之后再来回顾会豁然开朗)
Python实现简单爬虫(爬取下载链接)(像我急功近利的同学同时也可以参考这里,爬虫相关的基础,里面还有一个在线检测正则的网站,这里先贴出来Regex101)

---

使用的工具

a.BeautifulSoup4

打开cmd运行以下即可,Python模块大多可以用(pip install xxx)执行安装

pip install BeautifulSoup4

按照需求感兴趣的同学可以参考Beautiful Soup 4.2.0 文档进行拓展。

b.Fiddler 4

要知道,爬虫工作的时候会对网站的服务器进行访问。无脑的爬虫行为会占有该服务器资源从而出现瘫痪的可能。当然我们学习爬虫不应该用于攻击性的行为,而某些网站设计的时候为了防止爬虫攻击会加入一个拒绝费浏览器访问的机制。Fiddler 4则可以抓取网络服务的信息包,通过模拟这些信息包我们能使我们的爬虫模拟成浏览器行为,绕过以上所说的机制。
下载Fiddler 4
引用下网上的图:
Fiddler启动后,点开一个浏览器打开一个网页,该网页会出现在左侧列表中。选中网页后点开右侧的Inspectors,可以看到我们需要的Client等信息。

BeautifulSoup4 爬取AcFun文章区链接_第1张图片
Fiddler 4

---

分析网页

用Chrome打开网页,查看网页源代码我们得到目标的“今日最热”,截取下来

何止一个杂乱无章……
我们可以创建一个BeautifulSoup对象soup,通过print(soup.prettify())可以格式化输出一个更直观的网页源码。
用doc = r''' 上面代码框的内容 '''将其转化为字符串再用美丽汤的prettify()方法格式化输出

>>>soup.prettify()

可读性一下子就上来了可不是嘛。
然后就是发现规律了。通过标签定位到‘今日最热’类型的标题(网页上还有两个这种标题限于篇幅不以截取),然后发现每层的之中包含了文章链接的data-aid(编号)或是更为直观的href(把这段的内容加到A站主页链接之后就能直接访问到该文章了),以及用户只需要看到的title(标题)。为了照顾数据库的体积我们放弃更长的href而选取更为短小精悍的data-aid作为储存对象。详细见代码。

  • 若要将prettify()处理后的数据输出成文件,可以用codecs模块解决中文问题,同时用记事本以外编辑器打开(缺失解释器)

import codecs
name = u'君 的 name'
with codecs.open('n.txt', 'w', 'utf-8') as f:
        f.write(name)

---

代码

__author__ = 'maes_leung'
from bs4 import BeautifulSoup

import urllib.request
import urllib.parse
import re
import http.cookiejar

def getHtml(url):
    cj = http.cookiejar.CookieJar()          #创建一个CookieJar
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))     #利用HTTPCookieProcessor处理缓存
    opener.addheaders = [('User-Agent',
                          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'),
                         ('Cookie', '2c7505bca2e54d1e85df92d947f2cc5a')]             #加入用于模拟浏览器的headers
    urllib.request.install_opener(opener)
    html_bytes = urllib.request.urlopen(url).read()
    html_string = html_bytes.decode('utf-8')
    return html_string

#综合:        http://www.acfun.tv/v/list110/index.htm
#工作·情感:  http://www.acfun.tv/v/list73/index.htm
#动画文化:    http://www.acfun.tv/v/list74/index.htm
#漫画·轻小说:http://www.acfun.tv/v/list75/index.htm
#游戏:        http://www.acfun.tv/v/list74/index.htm
tarUrl = "http://www.acfun.tv/v/list110/index.htm"
html_doc = getHtml(tarUrl)
soup = BeautifulSoup(html_doc, 'html.parser')                    #创建一个BeautifulSoup对象    

block = soup.find_all('div', attrs = {"class" : "block"})

for b in block:
    if '今日最热' in str(b):
        for a in b.find_all('a'):
            print("id:" + a['data-aid'] +
                  "    title:" + a['title'])  

---

结果

喜人.avi

---
下一回:继续爬AcFun
本篇代码

你可能感兴趣的:(BeautifulSoup4 爬取AcFun文章区链接)