小白学python(爬虫知识1(大体框架)
定义框架
主函数: 1.初始网址 2.获取数据 3.保存数据
大体流程
from bs4 import BeautifulSoup # 解析网页
import re # 正则提取
import urllib.request,urllib.error #错误处理,网页提取
import xlwt #表格处理
def main():#先获取信息,再保存
#初始网址
baseurl = ""
#保存的信息
datalist =getData(baseurl)
#保存路径
savepath = ".xls"
#保存
saveData(datalist,savepath)
def getData(baseurl): #获取信息
return datalist
def saveData(datalist,savepath):# 保存信息
def askURL(url): #提取网页
return html
if __name__ == "__main__": #函数运行,相当与c的main()
main()
提取网页
主要用 urllib.requst 模块化流程如下:
def askURL(url):
#伪装的head
head = {
"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 = head)
html = "" #这句也可以不加,pyth会在用的时候自动为我们分配string型
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
head是我们向网页伪装已获得请求,如图可以找到:
注意此处为字典,要处理为键值对,一般只要伪装User-Agent就够了。
request = urllib.request.Request(url,headers = head)
此为发送请求,Request可查看源码,就不展开了。
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
response为返回的信息,用urlopen打开 html为读取出的网页信息,至此可以用 print(html)将信息打出来,可以看到html结构的树形信息表。
解析网页
#爬取网址
def getData(baseurl):
datalist = []
for i in range(0,10): #调用获取网页的函数10次
url = baseurl + str(i*25)
html = askURL(url) #保存获取的网页信息
#逐一解析
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"): #查找字符串
data = [] #保存一部电影的所有信息
item = str(item)
#print(item)
Link = re.findall(findLink,item)[0] #查找影片链接
data.append(Link)
imgSrc = re.findall(findImgSic,item)[0]
data.append(imgSrc) #匹配添加图片
titles = re.findall(findTitle,item)
if(len(titles)==2):
ctitle = titles[0]
data.append(ctitle)
otitle = titles[1].replace("/","")
data.append(otitle)
else :
data.append(titles[0])
data.append(' ') #外国名留空
rating =re.findall(findRating,item)
data.append(rating)
judgeNum = re.findall(findJudge,item)
data.append(judgeNum)
inq = re.findall(findIng,item)
if len(inq) !=0:
inq = inq[0].replace(",","")
data.append(inq)
else :
data.append(" ")
bd = re.findall(findBd,item)[0]
bd = re.sub('br(\s+)?/>(\s+)?'," ",bd)
bd = re.sub('/'," ",bd)
data.append(bd.strip())
datalist.append(data) #把处理好的一部电影信息存储
#print(datalist)
return datalist
我用的是BeautifulSoup,大家仁者见仁智者见智,找到方便的就好哦
soup = BeautifulSoup(html, "html.parser")
将已经提取出的网页进行解析,解析器为html.parser 同时我们可以打印出页面信息如:
print(type(soup.head))
print(soup.title)
print(soup.title.string)#string为打印文字
“.title”“.a"".head" 为html页面里的标签
同时可以用
print(soup.a.attrs)
拿到
用.attrs来拿到标签里的字典,很方便进一步处理 ps:(这里可以用print(type( ))来查看各部分具体的类型)
搜索文档
1.find_all();
1字符串过滤,会查找与之完全匹配的字符串
list = soup.find_all("a")
print(list)
2 正则搜索:使用search()匹配
import re
list=soup.find_all(re.compile("a"))
2.kwargs() 参数
list=soup.find_all(id="head")
3.text参数
list=soup.find_all(text = "hao123")
即用文本形式进行查找
正则提取
会专门写正则的博客,这里就不展开了,这里只记怎么用。
每个网页要提取的东西不尽相同,这里以豆瓣top250为例,我们从网页html看出我们要的信息在item中,
即
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):#查找字符串
data = [] #保存一部电影的所有信息
item = str(item) #强制转为字符串
把所需信息全都放到item中, 接下来,我们在item中用正则来提取我们要东西放到data中, 在这个for循环中,比如我们要找影片的链接,
Link = re.findall(findLink,item)[0] #查找影片链接
此处有findlink和item两个参数,【0】为取第一个链接即为所需 现在来定义findlink其为一个全局变量,即:
#影片链接规则
findLink = re.compile(r'<a href="(.*?)">')#创建正则表达式规则
此处用正则规则来提取网页html中的信息 接下来我们用
data.append(Link)
添加信息进data,然后
datalist.append(data) #把处理好的一部电影信息存储
return datalist
这就是大体提取流程,不同信息需要的细节不同,还有保存信息也需要进一步说明,今天先更到这,下次继续。
转载自:https://juejin.cn/post/6988457520666935326