1. 程式人生 > 其它 >find_all可以連續使用_Python爬蟲使用正則爬取網站,正則都不會就別玩爬蟲了!...

find_all可以連續使用_Python爬蟲使用正則爬取網站,正則都不會就別玩爬蟲了!...

技術標籤:find_all可以連續使用

本文章的所有程式碼和相關文章, 僅用於經驗技術交流分享,禁止將相關技術應用到不正當途徑,濫用技術產生的風險與本人無關。本文章是自己學習的一些記錄。歡迎各位大佬點評!

原始碼在GitHub上面,且相關介紹更加全面。連結如下https://github.com/zhazhalin/doubanTop250Spider.git或者點選如下連結github連結地址首先今天是第一天寫部落格,感受到了部落格的魅力,部落格不僅能夠記錄每天的程式碼學習情況,並且可以當作是自己的學習筆記,以便在後面知識點不清楚的時候前來複習。這是第一次使用爬蟲爬取網頁,這裡展示的是爬取豆瓣電影top250的整個過程,歡迎大家指點。

這裡我只爬取了電影連結和電影名稱,如果想要更加完整的爬取程式碼,請聯絡我。qq 1540741344 或者點選github連結地址 歡迎交流

開發工具: pycharm、chrome分析網頁在開發之前你首先要去你所要爬取的網頁提取出你要爬取的網頁連結,並且將網頁分析出你想要的內容。

在開發之前首先要匯入幾個模組,模組描述如下,具體不知道怎麼匯入包的可以看我下一篇內容

15d7ec39faaa80d97e2594181531f3f6.png

首先定義幾個函式,便於將各個步驟的工作分開便於程式碼管理,我這裡是分成了7個函式,分別如下:@主函式入口

if __name__=="__main__":       #程式執行入口
    main()

@捕獲網頁html內容 askURL(url)這裡的head的提取是在chrome中分析網頁原始碼獲得的,具體我也不做過多解釋,大家可以百度

def askURL(url):  #得到指定網頁資訊的內容 #爬取一個網頁的資料
    # 使用者代理,本質上是告訴伺服器,我們是以什麼樣的機器來訪問網站,以便接受什麼樣的水平資料
   head={"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 84.0.4147.89 Safari / 537.36"}
   request=urllib.request.Request(url,headers=head)         #request物件接受封裝的資訊,通過urllib攜帶headers訪問資訊訪問url
   response=urllib.request.urlopen(request)                  #用於接收返回的網頁資訊
   html=response.read().decode("utf-8")                      #通過read方法讀取response物件裡的網頁資訊,使用“utf-8”
   return  html                                             #返回捕獲的網頁內容,此時還是未處理過的

@將baseurl裡的內容進行逐一解析 getData(baseURL)這裡面的findlink和findname是正則表示式,可以首先定義全域性變數

findlink=r'<a class="" href="(.*?)"'
findname=r'<span class="title">(.*?)</span>'

def getData(baseURL):

dataList=[] #初始化datalist用於儲存獲取到的資料

for i in range(0,10):

url=baseURL+str(i*25)

html=askURL(url) #儲存獲取到的原始碼

soup=BeautifulSoup(html,"html.parser") #對html進行逐一解析,使用html.parser解析器進行解析

for item in soup.find_all("div",class_="item"): #查詢符合要求的字串 ,形成列表,find_all是查詢所有的class是item的div

data=[] #初始化data,用於捕獲一次爬取一個div裡面的內容

item=str(item) #將item資料型別轉化為字串型別

# print(item)

link=re.findall(findlink,item)[0] #使用re裡的findall方法根據正則提取item裡面的電影連結

data.append(link) #將網頁連結追加到data裡

name=re.findall(findname,item)[0] #使用re裡的findall方法根據正則提取item裡面的電影名字

data.append(name) #將電影名字連結追加到data裡

# print(link)

# print(name)

dataList.append(data) #將捕獲的電影連結和電影名存到datalist裡面

return dataList #返回一個列表,裡面存放的是每個電影的資訊

print(dataList)

@儲存捕獲的資料到excel saveData(dataList,savepath)

def saveData(dataList,savepath):                            #儲存捕獲的內容到excel裡,datalist是捕獲的資料列表,savepath是儲存路徑
    book=xlwt.Workbook(encoding="utf-8",style_compression=0)#初始化book物件,這裡首先要匯入xlwt的包
    sheet=book.add_sheet("test",cell_overwrite_ok=True)     #建立工作表
    col=["電影詳情連結","電影名稱"]                           #列名
    for i in range(0,2):
        sheet.write(0,i,col[i])                             #將列名逐一寫入到excel
    for i in range(0,250):
        data=dataList[i]                                    #依次將datalist裡的資料獲取
        for j in range(0,2):
            sheet.write(i+1,j,data[j])                      #將data裡面的資料逐一寫入
    book.save(savepath)          

@儲存捕獲的資料到資料庫

def saveDataDb(dataList,dbpath):
    initDb(dbpath)                                          #用一個函式初始化資料庫
    conn=sqlite3.connect(dbpath)                            #初始化資料庫
    cur=conn.cursor()                                       #獲取遊標
    for data in dataList:                                   
        for index in range(len(data)):  
            data[index]='"'+data[index]+'" '                #將每條資料都加上""
        #每條資料之間用,隔開,定義sql語句的格式
        sql='''
            insert into test(link,name) values (%s)         
        '''%','.join (data)
        cur.execute(sql)                                    #執行sql語句
        conn.commit()                                       #提交資料庫操作
    conn.close()
    print("爬取存入資料庫成功!")

@初始化資料庫 initDb(dbpath)

def initDb(dbpath):
    conn=sqlite3.connect(dbpath)
    cur=conn.cursor()
    sql='''
        create table test(
            id integer primary key  autoincrement,
            link text,
            name varchar 
            
        )
    '''
    cur.execute(sql)
    conn.commit()
    cur.close()
    conn.close()

@main函式,用於呼叫其他函式 main()

def main():
    dbpath="testSpider.db"                             #用於指定資料庫儲存路徑
    savepath="testSpider.xls"                          #用於指定excel儲存路徑
    baseURL="https://movie.douban.com/top250?start="   #爬取的網頁初始連結
    dataList=getData(baseURL)
    saveData(dataList,savepath)
    saveDataDb(dataList,dbpath)

你學會了嗎 獲取加群加群:1136192749