爬虫(2)-电影天堂2022精品电影
1.爬取2022精品电影名和下载链接(种子)
# -*- coding: utf-8 -*- """ @Time : 2022/3/18 17:21 @Author : Andrew @File : 电影天堂.py """ import csv import requests import re """ 1.第一步还是先定位目标2022新片所在weizhi1 2.从中提取到子页面的链接地址 3.请求该链接地址,拿到我们的下载链接 4.查看返回的网页源代码时,发现乱码, 由于request.get()后会自动进行一次utf-8解码, 但这只对用utf-8编码的网页有效,因此需要查看源 代码中meta标签的charset检查源代码的编码格式 5.在设计正则表达式时,要注意: 不能有多余的空格; 注意看原来的代码里的引号结构,定位的源代码属性值是用'',那么在就r"",反之r'' 6.提取页面的子链接,就找它的跳转url,a标签就找href 7.关于finditer的返回值迭代器: it里面: match为匹配的字符串,通过it.group("name")获取,(?P<name>.*?) span为该字符串从始末位置,是个元组,通过it.span()获取 it.groupdict()将会把it.group("name")的值和“name”组成字典 8.面对爬取到的页面,当作字符串处理就行了,不用考虑html结构上的问题, 截取哪里就从哪里开始,哪里结束就到哪里,哪怕取到问号呢,不要受到干扰 比如下面代码中取href时,取出从href="到"的内容: r'href="(?P<url>.*?)"' """ # 创建文件 ,utf-8保证不乱码,newline=""防止excel打开csv时有多余空行 f = open("data_movie.csv", mode="w", encoding="utf-8", newline="") csvWriter = csv.writer(f) title = {'title': "电影名字", 'download': "下载链接"} csvWriter.writerow(title.values()) # 写入标题 # 电影天堂的主页 domain = "https://m.dytt8.net/index2.htm" # header resp = requests.get(domain, verify=False) # verify = False 取消安全验证 resp.encoding = 'gb2312' # print(resp.text) content1 = resp.text # 预定义正则 obj1 = re.compile(r'2022新片精品.*?手机浏览,推荐下载本站app,绿色小巧,简单实用!详情请点击!.*?</tr>(?P<table>.*?)</table>', re.S) obj2 = re.compile(r"最新电影下载</a>]<a href='(?P<href>.*?)'>", re.S) obj3 = re.compile(r'◎译 名(?P<movieName>.*?)<br />.*?<a target="_blank" href="(?P<downLoad>.*?)"', re.S) result1 = obj1.finditer(content1) childDomainList = [] for it in result1: # 提取子页面的url content2 = it.group('table') result2 = obj2.finditer(content2) for itt in result2: # itt: 最新电影下载</a>]<a href='(?P<href>.*?)'> 匹配到的一条信息 child_domain = domain.replace("/index2.htm", "") + itt.group('href') childDomainList.append(child_domain) # 提取子页面 for href in childDomainList: respChild = requests.get(href, verify=False) respChild.encoding = 'gb2312' content3 = respChild.text result3 = obj3.finditer(content3) for i in result3: print(i.group('movieName')) print(i.group('downLoad')) dic = i.groupdict() csvWriter.writerow(dic.values()) resp.close()
2.beautifulsoup2022精品电影名和子链接
# -*- coding: utf-8 -*- """ @Time : 2022/3/19 14:15 @Author : Andrew @File : bs4解析.py """ import csv import re import requests from bs4 import BeautifulSoup """ bs4基于html(hyper text market language)的标签和属性来进行解析的 <标签 属性=属性值>内容</标签> """ # 创建文件 ,utf-8保证不乱码,newline=""防止excel打开csv时有多余空行 f = open("movieName.csv", mode="w", encoding="utf-8", newline="") csvWriter = csv.writer(f) title = {'movieName': "电影名字", 'childurl': "子链接"} csvWriter.writerow(title.values()) # 写入标题 # 安装 pip install bs4 url = "https://m.dytt8.net/index2.htm" resp = requests.get(url) resp.encoding = "gb2312" # print(resp.text) # 解析数据 # 1.把页面源代码交给BeauifulSoup进行处理,生成bs4对象 page = BeautifulSoup(resp.text, "html.parser") # 告诉BeautifulSoup,resp.text就是html,指定html解析器 # 2.从bs对象中取数据 # find(标签,属性 = 属性值) 找到一个满足条件的标签就返回 # find_all(标签,属性 = 属性值) 找到所有的满足条件的标签返回 # table = page.find("table", class_="co_content8") # class_对应标签属性class table = page.find("table", attrs={"border": "0", "cellpadding": "0", "cellspacing": "0", "width": "100%"}) # 这个也可以 # print(table) # 找所有的tr,并从第2个tr开始,即就是去掉第一个游戏app杂物 trs = table.find_all('tr')[1:] obj = re.compile(r'href="(?P<href>.*?)"', re.S) for tr in trs: # 找出每个tr中所有的td,并将从第二个a开始存,因为源代码中,第一个a是最新电影下载,不是我们要的 td = tr.find_all("td", attrs={"width": "85%", "height": "22", "class": "inddline"}) a = td[0].find_all("a")[1:] # print(str(a[0])) result = obj.finditer(str(a[0])) # 子链接 childurl = "" for it in result: childurl = url.replace("/index2.htm", "") + it.group("href") movies = {"movieName": a[0].text, "childurl": childurl} csvWriter.writerow(movies.values()) f.close() resp.close()