python中爬虫函数_如何入门 Python 爬虫?

本文详细介绍了如何使用Python爬取猫眼电影排行榜前100的信息,包括电影名、演员、上映时间和评分,通过正则表达式解析HTML并保存到txt文件。关键技术包括requests库获取HTML、re模块的正则表达式匹配和生成器的使用。
摘要由CSDN通过智能技术生成

Top100榜单共分为10页,经过观察,每一页的URL区别为:get请求参数 offset 变化。

所以URL如下设置:

url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)

获取单页的html的代码写为一个函数:

# 获取单页的html

def get_one_page(url):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'

}

# requests.get(url,headers) 头这样设置无法返回结果,相当于没有加请求头

response = requests.get(url, headers=headers)

if response.status_code == 200:

return response.text

return None

我们抓取的内容为6个:排行序号、图片地址、电影名、演员、上映时间(国家)、得分

经过观察,每一个电影的信息在html中的一个

标签中,如下图:

使用正则表达式,对我们所需信息的解析函数如下:

# 进行单页的解析,返回单页中我们需要的全部信息

def parse_one_page(html):

# 提取排名数

.*?board-index.*?>(.*?)

# 提取图片 data-src="(.*?)"

# 提取电影名

(.*?)

# 提取演员

(.*?)

# 提取上映时间

(.*?)

# 提取评分

(.*?)(.*?)

pattern = re.compile('

.*?board-index.*?>(.*?).*?data-src="(.*?)".*?(.*?).*?(.*?).*?(.*?).*?(.*?)(.*?).*?',re.S)

items = re.findall(pattern,html)

for item in items:

# 使用 yield 关键字,关键字所在的函数变为一个生成器(generator),

# 调用该函数会返回一个 iterable 对象,然后就可以迭代进行输出。

# 使用 yield 的好处是,对于需要返回很大空间的数据,可以节省内存空间。

# 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象。

# 当你使用for进行迭代的时候,函数中的代码才会执行。相当于每次返回一次迭代的数据,节省了很大的内存空间。

yield {

'index':item[0].strip(),

'image':item[1].strip(),

'title':item[2].strip(),

'actor':item[3].strip()[3:] if len(item[3])>3 else '',

'time':item[4].strip()[5:] if len(item[4])>5 else '',

'score':item[5].strip() + item[6].strip()

}

然后我们将获取的信息写入到一个txt文件中,写入每一条电影信息的函数如下:

# 写入一条电影信息,实现文本追加

def write_one_movie(content):

with open('maoyanResult.txt','a',encoding='utf-8') as f:

# 这里通过 JSON 库的 dumps()方法实现字典的序列化,

# 指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码

# print(type(json.dumps(content)))

f.write(json.dumps(content,ensure_ascii=False) + '\n')

# 但是试了一下,直接str()转换也可以实现相同的写入

# f.write(str(content) + '\n')

然后将以上三个函数汇总,得到获取一页数据的总控制函数:

# 获取一页数据的总控制方法

def main_one_page(page_num):

maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)

html = get_one_page(maoyan_url)

for item in parse_one_page(html):

write_one_movie(item)

最后整合起来,分页爬取,将Top100全部爬下来:

if __name__ == '__main__':

if os.path.exists('maoyanResult.txt'):

os.remove('maoyanResult.txt')

for i in range(0,99,10):

print('正在爬取第 {} 页 ...'.format(int(i/10 + 1)))

main_one_page(i)

time.sleep(1)

最终结果如下图

最终代码整合:

import requests

import re

import json

import os

import time

# 获取单页的html

def get_one_page(url):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'

}

# requests.get(url,headers) 头这样设置无法返回结果,相当于没有加请求头

response = requests.get(url, headers=headers)

if response.status_code == 200:

return response.text

return None

# 进行单页的解析,返回单页中我们需要的全部信息

def parse_one_page(html):

# 提取排名数

.*?board-index.*?>(.*?)

# 提取图片 data-src="(.*?)"

# 提取电影名

(.*?)

# 提取演员

(.*?)

# 提取上映时间

(.*?)

# 提取评分

(.*?)(.*?)

pattern = re.compile('

.*?board-index.*?>(.*?).*?data-src="(.*?)".*?(.*?).*?(.*?).*?(.*?).*?(.*?)(.*?).*?',re.S)

items = re.findall(pattern,html)

for item in items:

# 使用 yield 关键字,关键字所在的函数变为一个生成器(generator),

# 调用该函数会返回一个 iterable 对象,然后就可以迭代进行输出。

# 使用 yield 的好处是,对于需要返回很大空间的数据,可以节省内存空间。

# 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象。

# 当你使用for进行迭代的时候,函数中的代码才会执行。相当于每次返回一次迭代的数据,节省了很大的内存空间。

yield {

'index':item[0].strip(),

'image':item[1].strip(),

'title':item[2].strip(),

'actor':item[3].strip()[3:] if len(item[3])>3 else '',

'time':item[4].strip()[5:] if len(item[4])>5 else '',

'score':item[5].strip() + item[6].strip()

}

# 写入一条电影信息,实现文本追加

def write_one_movie(content):

with open('maoyanResult.txt','a',encoding='utf-8') as f:

# 这里通过 JSON 库的 dumps()方法实现字典的序列化,

# 指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码

# print(type(json.dumps(content)))

f.write(json.dumps(content,ensure_ascii=False) + '\n')

# 但是试了一下,直接str()转换也可以实现相同的写入

# f.write(str(content) + '\n')

# 获取一页数据的总控制方法

def main_one_page(page_num):

maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)

html = get_one_page(maoyan_url)

for item in parse_one_page(html):

write_one_movie(item)

if __name__ == '__main__':

if os.path.exists('maoyanResult.txt'):

os.remove('maoyanResult.txt')

for i in range(0,99,10):

print('正在爬取第 {} 页 ...'.format(int(i/10 + 1)))

main_one_page(i)

time.sleep(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值