python爬虫

cnblogs 2024-06-14 08:09:01 阅读 94

What's 爬虫?

简单来说:

爬虫,即网络蜘蛛,是伪装成客户端与服务器进行数据交互的程序。

代码

点击查看代码

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 >(.*)</span>')

#影片评分

findRating = re.compile(r'<span property="v:average">(.*)</span>')

#影片热评

findComment = re.compile(r'<span >(.*?)</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,你就可以得到一个进度条

思路

1.获取网页的源码

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

用个循环,根据网页制定一下url

找到用于伪装客户端User-Agent

在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

用urllib获取你制定的url的源码

在 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)

2.解析数据

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

BeautifulSoup

bs4是一个强大的库,用于从HTML和XML文件中提取数据,它能够将复杂的HTML结构转换成树形结构(即元素树),使得开发者可以方便地搜索、遍历以及修改网页内容。

"html.parser": 这是BeautifulSoup用来解析HTML文档的解析器。在这个案例中,它是指Python自带的标准HTML解析器。除了标准的解析器外,BeautifulSoup还可以配合其他第三方解析器如 lxml 来使用。

用bs4和re筛选信息

3.保存数据 写入excel表中

需要用到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)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。