赞
踩
爬虫,即网络蜘蛛,是伪装成客户端与服务器进行数据交互的程序。
本人大一,为了学习python写个爬虫,代码需要优化的地方,还望各位大佬能不吝赐教!写博客的初心只是为了记录学习,如果对大家有帮助就更好了。
一些底层的东西可以看看别的博文
- from bs4 import BeautifulSoup #网页解析
- import urllib.request,urllib.error #制定URL,获取网页数据
- import re #正则表达式 进行文字匹配
- import xlwt #进行excel操作
- from tqdm import trange #进度条库
-
- def main():
- baseurl = "https://movie.douban.com/top250?start="
- # 1.爬取网页
- # 2.逐一解析数据
- datalist =getDate(baseurl)
- # 3.保存数据
- savepath = "豆瓣top250.xls"
- savedata(datalist,savepath)
-
- #影片详情链接
- findLink = re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串的模式)
- #影片图片的链接
- findImagesrc = re.compile( r'<img[^>]+src=["\']([^"\']+)["\']') #ai写的正则
- #影片中文片名
- findName = re.compile(r'<span class="title">(.*)</span>')
- #影片评分
- findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
- #影片热评
- findComment = re.compile(r'<span class="inq">(.*?)</span>')
-
- def getDate(baseurl):
- datalist = []
- # 1.爬取网页
- for i in trange(0,10):
- url = baseurl + str(i*25)
- html = askURL(url) #保存获取到的网络源码
- soup = BeautifulSoup(html,"html.parser")
- for item in soup.find_all('div',class_="item"):
- # 2.逐一解析数据
- item =str(item)
- data=[]
- name = re.findall(findName,item)[0]
- data.append(name)
- link = re.findall(findLink,item)[0]
- data.append(link)
- img = re.findall(findImagesrc,item)[0]
- data.append(img)
- rating = re.findall(findRating,item)
- data.append(rating)
- comment = re.findall(findComment,item)
- if len(comment)!=0:
- comment=comment[0].replace("。","")
- data.append(comment)
- else:
- data.append(" ")
- datalist.append(data)
-
- return datalist
-
- def askURL(url):
- head={
- "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
- }
- request = urllib.request.Request(url,headers=head)
- html= ""
- try:
- response=urllib.request.urlopen(request)
- html=response.read().decode("utf-8")
- except urllib.error.URLError as e:
- if hasattr(e,"code"):
- print(e.code)
- if hasattr(e,"reason"):
- print(e.reason)
- return html
-
- def savedata(datalist,savepath):
- book = xlwt.Workbook(encoding="utf-8",style_compression=0) #压缩样式效果,设为0
- sheet = book.add_sheet('top250',cell_overwrite_ok=True) #每个单元在写入时覆盖以前的内容
- col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
- for i in range(0,len(col)):
- sheet.write(0,i,col[i]) #列名
- for i in range (0,250):
- data = datalist[i]
- for j in range (0,len(col)):
- sheet.write(i+1,j,data[j])
-
- book.save(savepath)
-
- if __name__ == "__main__":
- main()
- print("爬取完成")
from bs4 import BeautifulSoup #网页解析
import urllib.request,urllib.error #制定URL,获取网页数据
import re #正则表达式 进行文字匹配
import xlwt #进行excel操作
from tqdm import trange
#进度条库,当然你也可以不用,这个库只需要把for循环里的range改为trange,你就可以得到一个进度条
- def askURL(url):
- head={
- "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
- }
- request = urllib.request.Request(url,headers=head)
- html= ""
- try:
- response=urllib.request.urlopen(request)
- html=response.read().decode("utf-8")
- #print(html)
- except urllib.error.URLError as e:
- if hasattr(e,"code"):
- print(e.code)
- if hasattr(e,"reason"):
- print(e.reason)
- return html
- for i in trange(0,10):
- url = baseurl + str(i*25)
用个循环,根据网页制定一下url
在network里刷新一下网页,找到发送的标头header
这个是user-agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0
在 try 块中:
调用 urllib.request.urlopen(request) 发送HTTP请求,并获取响应对象 response。
通过 response.read() 获取服务器返回的原始二进制数据。
使用 decode("utf-8") 方法将二进制数据解码成UTF-8编码的字符串,并将其赋值给变量 html。
如果在执行 urlopen 函数过程中出现 urllib.error.URLError 异常,则进入 except 块:
判断异常对象是否包含 .code 属性,如果有则打印出HTTP状态码。
再判断异常对象是否包含 .reason 属性,如果有则打印出错误原因。
最后,无论是否发生异常,都返回抓取到的网页HTML内容(即变量 html)
- def getDate(baseurl):
- datalist = []
- # 1.爬取网页
- for i in trange(0,10):
- url = baseurl + str(i*25)
- html = askURL(url) #保存获取到的网络源码
- soup = BeautifulSoup(html,"html.parser")
- for item in soup.find_all('div',class_="item"):
- # 2.逐一解析数据
- item =str(item)
- data=[]
- name = re.findall(findName,item)[0]
- data.append(name)
- link = re.findall(findLink,item)[0]
- data.append(link)
- img = re.findall(findImagesrc,item)[0]
- data.append(img)
- rating = re.findall(findRating,item)
- data.append(rating)
- comment = re.findall(findComment,item)
- if len(comment)!=0:
- comment=comment[0].replace("。","")
- data.append(comment)
- else:
- data.append(" ")
- datalist.append(data)
-
- return datalist
bs4是一个强大的库,用于从HTML和XML文件中提取数据,它能够将复杂的HTML结构转换成树形结构(即元素树),使得开发者可以方便地搜索、遍历以及修改网页内容。
"html.parser": 这是BeautifulSoup用来解析HTML文档的解析器。在这个案例中,它是指Python自带的标准HTML解析器。除了标准的解析器外,BeautifulSoup还可以配合其他第三方解析器如 lxml 来使用。
需要用到xwlt库
- def savedata(datalist,savepath):
- book = xlwt.Workbook(encoding="utf-8",style_compression=0) #压缩样式效果,设为0
- sheet = book.add_sheet('top250',cell_overwrite_ok=True) #每个单元在写入时覆盖以前的内容
- col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
- for i in range(0,len(col)):
- sheet.write(0,i,col[i]) #列名
- for i in range (0,250):
- data = datalist[i]
- for j in range (0,len(col)):
- sheet.write(i+1,j,data[j])
-
- book.save(savepath)
路好不好走,也许我不能决定,但走不走,却只有我能决定。
----天官赐福
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。