一直在学习python,语法什么学习了很久,今天记录一下python实战,使用pyhton爬虫爬取猫眼网站最热电影top100,下面是代码与我编写遇到的坑,有注释很清晰
代码可能有一些缩进问题,复制到编辑器自行调整
#首先分析网站结构,请求链接,分析数据所在的标签
#首先打开网站,可以看的他的链接 ‘https://maoyan.com/board/4’, 这个就是我们需要请求的链接
#接下来,滑到页面底部,可以看到又一个分页功能,一页只显示10个,如果100那么就是10页
#接下来点击下一页看一下会发生什么
#可以看的连接上带了一个offset=10的参数,然后继续点击
#链接上的参数变成了20,这样我就可以获得他这个规律,offset代表着偏移量,10就是 11-20 20就是21-30 那么99-100 offset=90,点击验证一下果然是这样
#那么这个参数就可以通过一个循环出来
for i in range(10):
offset=i * 10
#接下来我们请求为了不被网站反爬虫机制给检测到所以我们需要伪装一下请求头,这个直接可以打开网站的f12把请求头复制下来即可
#我在使用的时候运行个几次然后就会弹出猫眼的二维码验证就无法爬取了,然后我又换了一个浏览器的伪装每几次又被检测到了,最后我又在请求头里加了cookies,然后又可以爬取了,但是爬全部数据的时候有时候还是会被验证码拦截,这个大家就自己尝试即可,伪装浏览器python有一个第三方库,我在自己这里试着用了一下,没有什么用处大家自己可以尝试使用下
/****************************/
from fake_useragent import UserAgent
print("---以下是随机的请求头--")
for i in range(5):
print(UserAgent().random)
print("---以下是指定的请求头--")
print(UserAgent().chrome)
print(UserAgent().ie)
print(UserAgent().firefox)
print(UserAgent().opera)
print(UserAgent().safari)
/****************************/
#请求这块大概就是这样了,接下来就是,开始分析element里面的数据的存储位置,打开网站,检查页面源代码
# 可以看的每一个电影都在标签<dd></dd>里面,然后通过循环出来所有的表单,接下来就是需要正则匹配获取每一个表单的所有数据,正则这里我就直接写到代码里的大家可以自己看一下很简单
#好了,大概爬取一个页面所需要的东西我们都分析完了,那么接下来就愉快的写起代码吧!!!
#引入基本模块,requests 用于请求,re用于关于正则匹配提取需要的数据,json就是序列化存储数据
import requests import re import json ''' 首先我们先来编写第一个方法,看名字大家也知道,获取一个页面 传入参数,参数也就是页面的链接 然后接下来伪装一个headers 里面有浏览器信息和cookie,有可能被检测爬虫,这个大家自行尝试 然后使用requests 发送一个get请求,把链接和请求塞进去,这个大家应该都知道怎么使用 接下来判断返回的code是否等于200也就是是否请求成功,成功就返回页面的数据,否则就返回一个None,这个浏览器code返回常用的几个代表什么意思大家不知道的可以自行百度 第一个获取单个页面的方法就写完了,是不是很简单也很清晰,缩进问题大家自行处理 ''' def get_one_page(url):headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36', 'Cookie': 'BA_HECTOR=ag2k21a5048ha481t71g7ns0c0r; BD_UPN=143254; COOKIE_SESSION=8903254_0_7_7_11_12_0_0_7_6_0_0_0_0_0_0_1606225970_0_1618735107%7C9%230_0_1618735107%7C1; H_PS_645EC=6fbeca85mWHPYb9lkCQFIr8J1%2Bxo6Y6Wy815oV2tq08BtIVsZ7DvfDlFPioGVVwDJTWPGQ; BIDUPSID=A13A2621404D3EE49FFF618200FC12B6; BDRCVFR[d9MwMhSWl4T]=mk3SLVN4HKm; H_PS_PSSID=33814_33849_33758_33891; PSINO=5; delPer=0; BD_CK_SAM=1; BAIDUID=16C46051C27CC4435C5DBB527230E94A:FG=1; PSTM=1606226000' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text return None ''' 接下来我们开始解析一个页面里面的数据,也就是我们要获取一个页面的电影主要信息,这里需要使用到正则表达式, 参数传入我们刚刚获取的html结构数据,然后使用re.compile 定义一个正则对象,里面的具体匹配规则就是找到dd 然后非贪婪匹配(就是不多匹配)找到类名,获得数据(用括号括起来),继续找下一项,依次重复类推,最后 re.S 代表着可以匹配换行符(html数据大多都是换行,如果不加的话就没法匹配,使用详情,大家可以查看其他学习网站详情) 使用 re.findall 全匹配,传入正则规则和需要匹配的html 全匹配的话,就会获取一个数组也就是列表 [], 通过循环 yield生成器处理一下获取的数据生成一个字典,注意电影名称,演员,时间里面都可能有空格,需要strip去掉可能出现的空格,至于yield大家自己去查一下,很容易理解的 ''' def parse_one_page(html): ranking = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?data-val=.*?">(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime">(.*?)</p>.*?</dd>', re.S) items = re.findall(ranking, html) for item in items: yield { 'index': item[0], 'img': item[1], 'name': item[2].strip(), 'actor': item[3].strip(), 'time': item[4].strip() } ''' 接下来我们要写一个保存数据的方法,保存起我们获取的数据 打开一个文件,如果没有就会新建一个,至于用with 大家应该也知道,方便写法,不用手动关闭,参数文件名称,和写入的模式 ‘a’代表着追加写入,不会覆盖,编码就是utf-8 然后使用写入,使用json.dumps 写入数据,ensure_ascii=False为了处理中文,再加上一个换行符,这样写出来的数据好看又整齐 ''' def write_to_file(content): with open('result.txt', 'a', encoding='utf-8') as f: f.write(json.dumps(content, ensure_ascii=False)+'\n') ''' 最后我们就要写一个调用的主函数了,参数就是刚才我们所说的偏移量,因为我们要获取100个电影的排行 定义需要访问的链接 后面加上有可能偏移的参数 调用获取页面数据,赋值给html,然后把html传入到解析数据的这个函数中,当然现在这个函数已经成为了一个生成器,所以是可迭代的,然后调用写入方法,每一项都写入到result.txt文件里 ''' def main(offset): #调用获取函数 url = 'https://maoyan.com/board/4?offset=' + str(offset) html = get_one_page(url) for item in parse_one_page(html): write_to_file(item) #接下来用到了我们上面的那个计算分页偏移值了,执行总函数,把偏移值传入到里面,这样100条数据就被获取下来写入到文件里了 if __name__ == '__main__': for i in range(10): print(str(i) + '\n') main(offset=i*10)
猫眼视频榜单top100就这么被爬下来了,是不是觉得很简单呢,确实他就是这么简单,不要被爬虫吓住,其实他就是一个获取数据分析的工具,没那么复杂,当然也是我知道的太少了,其他一下反爬什么的我还没有遇到过,但是有问题就解决肯定是可以实现的,希望大家对爬虫有兴趣的都可以尝试一下,光学不练假把式,有反馈才能让你成长的更快,加油你是最胖的!
本练习有可能出现的问题,就是请求头验证那里,遇到了,也不用气馁,ok了,家人们,拜拜~