likes
comments
collection
share

小白学python(爬虫知识1(大体框架)

作者站长头像
站长
· 阅读数 48

定义框架

主函数: 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是我们向网页伪装已获得请求,如图可以找到: 小白学python(爬虫知识1(大体框架) 注意此处为字典,要处理为键值对,一般只要伪装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为打印文字

小白学python(爬虫知识1(大体框架) “.title”“.a"".head" 为html页面里的标签 同时可以用

print(soup.a.attrs)

拿到 小白学python(爬虫知识1(大体框架)

用.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")

小白学python(爬虫知识1(大体框架)

即用文本形式进行查找

正则提取

会专门写正则的博客,这里就不展开了,这里只记怎么用。 每个网页要提取的东西不尽相同,这里以豆瓣top250为例,我们从网页html看出我们要的信息在item中, 小白学python(爬虫知识1(大体框架)

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
评论
请登录