本博客介绍使用爬虫爬取猫眼电影最受期待榜单
先看main函数
代码, 这个函数用来获取一个页面上的榜单信息, 我们大致了解一下爬虫程序的框架
def main(offset):
url = 'http://maoyan.com/board/6?offset=' + str(offset)
html = getHtml(url)
info = getRank(html)
show(info)
我们可以看到, main函数有一个offset
参数传递进来
首先我们观察url, 用chrome浏览器打开http://maoyan.com/board/6?offset=0
, 就可以看到页面了. 观察一下会发现榜单有好几页, 翻页之后offset参数变成了10,20,30,40
, 那么我们就可以只修改offset参数获取不同页面上的信息了. offset
作为参数传递
然后我们具体获取一个页面的信息
调用getHtml函数获取到html页面, 将文件传递进getRank页面, 用正则表达式分析我们需要的信息(可通过浏览器查看源代码分析). getRank返回的列表就是一个排行上的信息了, 它是一个元组, 有三个元素, 分别是排行, 名称, 主演.
最后是展示阶段, 如果就这样输出会很难看, 那么我们就需要进行一些格式化处理. 可通过下面这样的代码来格式化
def show(info):
tmp = '{0:^5}{1:{3}^16}{2:{3}<10}'
for i in range(len(info)):
u = info[i]
with open('save.txt', 'a', encoding='utf-8') as f:
f.write(tmp.format(u[0], u[1], u[2], chr(12288)) + '\n')
print(tmp.format(u[0], u[1], u[2], chr(12288)))
如果我们想要输出到一个txt文件当中, 就用python的文件写入方法写入, 这里要注意的是使用模式'a'
, 这样后面的内容就可以追加进来而不会覆盖之前的内容了. encoding='utf-8'
, 设置编码也是非常重要的, 不然txt文件会是乱码的.
完整代码
import re
import requests
def getHtml(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
}
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
r.raise_for_status()
# print(r.text)
return r.text
except:
return ""
def getRank(html):
r = re.compile(r'index-(\d+).*?title="(.*?)".*?"star">(.*?)', re.S)
info = re.findall(r, html)
return info
def show(info):
tmp = '{0:^5}{1:{3}^16}{2:{3}<10}'
for i in range(len(info)):
u = info[i]
with open('save.txt', 'a', encoding='utf-8') as f:
f.write(tmp.format(u[0], u[1], u[2], chr(12288)) + '\n')
print(tmp.format(u[0], u[1], u[2], chr(12288)))
def main(offset):
url = 'http://maoyan.com/board/6?offset=' + str(offset)
html = getHtml(url)
info = getRank(html)
show(info)
if __name__ == '__main__':
with open('save.txt', 'w', encoding='utf-8') as f:
f.write('{0:{3}^5}{1:{3}^16}{2:{3}^10}'.format('排行', '名称', '主演', chr(12288)) + '\n')
print('{0:{3}^5}{1:{3}^16}{2:{3}^10}'.format('排行', '名称', '主演', chr(12288)))
for i in range(5):
main(i * 10)