这篇学习了是崔庆才老师的《python3网络爬虫开发实践》中的案例自己学习了下。大家可以买啊,通俗易懂。
秉承着无图无真相的精神。嘿嘿
一、代码
import re #正则表达式
import pandas as pd #excel保存
import requests as request #网络请求request
from fake_useragent import UserAgent #请求头参数构建
class CatEyeSpiper(object):
#初始化参数
def __init__(self):
self.ua = UserAgent() # 获取userAgent类
self._data = list()
self.head = {"User-Agent": self.ua.random}
#解析html文件
def parmer_html(self, offset):
url = "https://maoyan.com/board/4?offset={}".format(offset)
respon = request.get(url=url, headers=self.head)
print(respon.content.decode('utf-8'))
#主要是学习这句正则表达式 很简单
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?title="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',
re.S)
items = re.findall(pattern, respon.content.decode('utf-8'))
#循环遍历数据保存list
for item in items:
one_data = {
"image": item[1],
"title": item[2].strip(),
"actor": item[3].strip() if (len(item[3])) > 3 else '',
"time": item[4].strip() if (len(item[4])) > 5 else '',
"score": item[5].strip() + item[6].strip()
}
self._data.append(one_data)
print(self._data)
#保存excel在根目录
def save_excel(self):
data = pd.DataFrame(self._data)
data.to_csv("猫眼电影数据数据.csv", encoding='utf_8_sig') # 写入文件
def run(self):
#猫眼数据规则
for i in range(10):
self.parmer_html(offset=i * 10)
if len(self._data)>0:
self.save_excel()
if __name__ == ('__main__'):
carEye = CatEyeSpiper()
carEye.run()
二、正则分析
主要是下面图片一段html利用正则表达式数据提取。超简单
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default">
<img alt="我不是药神" class="board-img" src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c">
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p>
<p class="star">
主演:徐峥,周一围,王传君
</p>
<p class="releasetime">上映时间:2018-07-05</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>
</div>
</div>
</div>
</dd>
<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?title="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>'
- <dd>.*?board-index.*?>(.*?)</I> 匹配<dd>开头 .*?表示任何数字字符字母 (.*?)要提取出来的数据。 == <dd>****board-index****>(***)</i>结尾 提取编号
- .*?data-src="(.*?)".*? == ******data-src=(***)***** 提取图片网络地址
- <p.*?name.*?title="(.*?)".*? == <p*****name****title=(***)***** 提取片名
三、总结
易犯错误:
- 初始化参数list没有加括号,添加对象导致类型错误。类型不匹配。
- 请求地址未转换格式 utf-8,导致读取为byte类型不匹配解析。
- 正则表达式pattern后没有加 re.S 换行读取,导致数据读取不到。
- 下载pandas库太慢,使用清华镜像源下载解决。pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
学习知识:
- 正则表达式贪婪匹配于非贪婪匹配(.*?)
- Robos协议判断页面是否可抓取