小白学python(爬虫写着玩系列1)
最近周末没啥事情,跟着bilbil大学里面的视频跟着敲,从爬虫到数据处理再到数据可视化,感觉把python前端的知识大概了解下吧(大佬勿喷)。现在头大不行,一堆东西都只是浅尝辄止,感觉这样不太行,毕竟欲速则不达嘛。所以我现在先从我感兴趣的爬虫开始,找几个简单的网站爬一爬,随便玩玩同时加强知识的记忆与运用,把可能出现的问题都解决下,知识落到实地才是最重要的。我也会把代码和注释与注意标清楚(感觉都是给我自己看的啦),同时也谢谢大家能批评指正。
爬豆瓣电影排行榜
网址 豆瓣电影排行榜 这个和我之前学的很像,所以先从这开始吧。
爬出第一个信息 电影链接
注释很清楚了,就不过多解释了。
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作
def main():
baseurl = "https://movie.douban.com/chart"
print(GETDATA(baseurl))
findlink = re.compile(r'<a class="" href="(.*?)">')
def GETDATA(baseurl):
datalist = []
#此处的html是为解析的
html = GETURL(baseurl)
#用beautifulsoup进行树形解析
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('tr',class_='item'): #这里根据你查看网页源码来确定范围
data = []
item = str(item) #此处一定要变字符串,不然re会报错
#print(item)
link = re.findall(findlink,item) #建立规则用你打印出来的来创建,用网页的可能会出错
data.append(link)
datalist.append(data) #注意此处在for循环里面,不然会报变量未定义的错
return datalist
def GETURL(url):
#1.伪装
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"}
#请求
request = urllib.request.Request(url,headers=header)
#回应
response=urllib.request.urlopen(request)
#用utf-8读出来
html = response.read().decode("utf-8")
#完事返回
return html
if __name__ == "__main__":
main()
这里说下正则,正则默认为贪婪模式(尽可能匹配最多字符),所以.为匹配任意多字符,.?为匹配尽可能少字符(但在这其实都一样)
就一部分爬的网页来举例:
<tr class="item">
<td valign="top" width="100">
<a class="nbg" href="https://movie.douban.com/subject/35076714/" title="扎克·施奈德版正义联盟">
<img alt="扎克·施奈德版正义联盟" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg" width="75"/>
</a>
</td>
<td valign="top">
<div class="pl2">
<a class="" href="https://movie.douban.com/subject/35076714/">
扎克·施奈德版正义联盟
/ <span style="font-size:13px;">查克·史奈德之正义联盟(台) / 正义联盟导演剪辑版</span>
</a>
<p class="pl">2021-03-18(美国) / 本·阿弗莱克 / 亨利·卡维尔 / 盖尔·加朵 / 杰森·莫玛 / 埃兹拉·米勒 / 雷·费舍尔 / 艾米·亚当斯 / 威廉·达福 / 杰西·艾森伯格 / 杰瑞米·艾恩斯 / 戴安·琳恩 / 康妮·尼尔森 / J·K·西蒙斯 / 塞伦·希德 / 郑恺 / 艾梅柏·希尔德...</p>
<div class="star clearfix">
<span class="allstar45"></span>
<span class="rating_nums">8.9</span>
<span class="pl">(150044人评价)</span>
</div>
</div>
</td>
</tr>
<tr class="item">
<td valign="top" width="100">
<a class="nbg" href="https://movie.douban.com/subject/30456637/" title="沿路而下">
<img alt="沿路而下" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2633150167.jpg" width="75"/>
</a>
</td>
<td valign="top">
<div class="pl2">
<a class="" href="https://movie.douban.com/subject/30456637/">
沿路而下
/ <span style="font-size:13px;">90分钟惊涛械劫(港) / 马德里金库盗数90分钟(台)</span>
</a>
<p class="pl">2021-01-15(中国台湾) / 2021-11-12(西班牙) / 弗莱迪·海默 / 阿斯特丽德·伯格斯-弗瑞斯贝 / 利亚姆·坎宁安 / 萨姆·赖利 / 法米克·詹森 / 路易斯·托萨尔 / 何塞·科罗纳多 / 阿克塞尔·施泰因 / 埃米利奥·古铁雷斯·卡巴 / 亨特·特里梅恩...</p>
<div class="star clearfix">
<span class="allstar35"></span>
<span class="rating_nums">7.0</span>
<span class="pl">(6103人评价)</span>
</div>
</div>
</td>
</tr>
这里有两个电影的资料,可以看出一个电影资料从 < tr class="item"> 到< /tr>,就可以此为循环搜索; < a class="" href="movie.douban.com/subject/350… 其实大部分文字匹配用.或.?就完事了。 我要是匹配间断时间如 2002-1-8,就写为(\d*)-(\d*)-(\d*)就行了。
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作
def main():
baseurl = "https://movie.douban.com/chart"
result = GETDATA(baseurl)
savepath = "movie_text.xls"
cnt = 0
# for i in range(0,10):
# data = result[i]
# for j in range(0,4):
# print(data[j])
# print(type(data[j]))
# for i in range(0,3):
# result[2][i].append(text)
# print(text)
# for i in result[2][2]:
# tt=list(i)
# print(tt)
# print(type(tt))
SAVE(savepath,result)
print("OK")
findlink = re.compile(r'<a class="" href="(.*?)">')
findname = re.compile(r'title="(.*)">')
findtime = re.compile(r'<p class="pl">(\d*)-(.\d*)-(\d*)')
findactor = re.compile(r'/ (.*?)...</p>')
def GETDATA(baseurl):
datalist = []
#此处的html是为解析的
html = GETURL(baseurl)
#用beautifulsoup进行树形解析
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('tr',class_='item'): #这里根据你查看网页源码来确定范围
data = []
item = str(item) #此处一定要变字符串,不然re会报错
#print(item)
#链接
link = re.findall(findlink,item) #建立规则用你打印出来的来创建,用网页的可能会出错
data.append(link)
#电影名
name = re.findall(findname,item)
data.append(name)
#上映时间
time = re.findall(findtime, item)#这里要哭了,这里匹配完成为tuple,不能写入,还得变成list才行
res = ['-'.join(i) for i in time]
data.append(res)
#演员表
actor = re.findall(findactor,item)
data.append(actor)
datalist.append(data) #注意此处在for循环里面,不然会报变量未定义的错
return datalist
def SAVE(savepath,datalist):
#以utf-8创建excel对象book
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
#创建一个sheet表
sheet =book.add_sheet('douban250',cell_overwrite_ok=True)
col = ["影片豆瓣链接",'名称','上映时间','演员']
for i in range(0,4):
sheet.write(0,i,col[i])
for i in range(0,10):
print("%d条" % i)
data = datalist[i]
for j in range(0,4):
sheet.write(i+1,j,data[j])
book.save(savepath)
def GETURL(url):
#1.伪装
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"}
#请求
request = urllib.request.Request(url,headers=header)
#回应
response=urllib.request.urlopen(request)
#用utf-8读出来
html = response.read().decode("utf-8")
#完事返回
return html
if __name__ == "__main__":
main()
写完这个真的是对爬数据有了很深的理解。。下一步爬爬图片啥的。
转载自:https://juejin.cn/post/6989187381047853070