python request url 转义_Python爬虫入门笔记
來源:blog.csdn.net/weixin_44864260
爬蟲四大步驟:
1.獲取頁面源代碼
2.獲取標簽
3.正則表達式匹配
4.保存數據
1. 獲取頁面源代碼
5個小步驟:
1.偽裝成瀏覽器
2.進一步包裝請求
3.網頁請求獲取數據
4.解析并保存
5.返回數據
代碼:
import urllib.request,urllib.error #指定URL,獲取頁面數據#爬取指定urldef askUrl(url): #請求頭偽裝成瀏覽器(字典) 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.3776.400 QQBrowser/10.6.4212.400"} #進一步包裝請求 request = urllib.request.Request(url = url,headers=head) #存儲頁面源代碼 html = "" try: #頁面請求,獲取內容 response = urllib.request.urlopen(request) #讀取返回的內容,用"utf-8"編碼解析 html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e,"code"): print(e.code) if hasattr(e,"reson"): print(e.reson) #返回頁面源代碼????return?html2.獲取標簽
通過BeautifulSoup進一步解析頁面源代碼
from?bs4?import?BeautifulSoup?#頁面解析,獲取數據Beautiful Soup 將復雜 HTML 文檔轉換成一個復雜的樹形結構,每個節點都是 Python 對象,可分為四大對象種類,這里主要用到Tag類的對象,還有三種,有興趣可以自己去深入學習~~
#構建了一個BeautifulSoup類型的對象soup#參數為網頁源代碼和”html.parser”,表明是解析html的bs = BeautifulSoup(html,"html.parser")#找到所有class叫做item的div,注意class_有個下劃線bs.find_all('div',class_="item")3.正則表達式匹配
先準備好相應的正則表達式,然后在上面得到的標簽下手
#Python正則表達式前的 r 表示原生字符串(rawstring)#該字符串聲明了引號中的內容表示該內容的原始含義,避免了多次轉義造成的反斜杠困擾#re.S它表示"."的作用擴展到整個字符串,包括“\n”#re.compile()編譯后生成Regular Expression對象,由于該對象自己包含了正則表達式#所以調用對應的方法時不用給出正則字符串。#鏈接findLink = re.compile(r'',re.S)#找到所有匹配的#參數(正則表達式,內容)#[0]返回匹配的數組的第一個元素?link?=?re.findall(findLink,item)[0]4.保存數據
兩種保存方式
1.保存到Excel里
import xlwt #進行excel操作def saveData(dataList,savePath): #創建一個工程,參數("編碼","樣式的壓縮效果") woke = xlwt.Workbook("utf-8",style_compression=0) #創建一個表,參數("表名","覆蓋原單元格信息") sheet = woke.add_sheet("豆瓣電影Top250",cell_overwrite_ok=True) #列明 col = ("鏈接","中文名字","英文名字","評分","標題","評分人數","概況") #遍歷列名,并寫入 for i in range (7): sheet.write(0,i,col[i]) #開始遍歷數據,并寫入 for i in range (0,250): for j in range (7): sheet.write(i+1,j,dataList[i][j]) print("第%d條數據"%(i+1)) #保存數據到保存路徑 woke.save(savePath)????print("保存完畢")結果文件:
2.保存到數據庫
import sqlite3 #進行sql操作#新建表def initdb(dataPath): #連接dataPath數據庫,沒有的話默認新建一個 conn = sqlite3.connect(dataPath) #獲取游標 cur = conn.cursor() #sql語句 sql = ''' create table movie( id Integer primary key autoincrement, info_link text, cname varchar , fname varchar , rating varchar , inq text, racount varchar , inf text ) ''' #執行sql語句 cur.execute(sql) #提交事物 conn.commit() #關閉游標 cur.close() #關閉連接 conn.close()def savedb(dataList,dataPath): #新建表 initdb(dataPath) #連接數據庫dataPath conn = sqlite3.connect(dataPath) #獲取游標 cur = conn.cursor() #開始保存數據 for data in dataList: for index in range(len(data)): #在每個數據字段兩邊加上""雙引號 data[index] = str('"'+data[index]+'"') #用","逗號拼接數據 newstr = ",".join(data) #sql語句,把拼寫好的數據放入sql語句 sql ="insert into movie(info_link,cname,fname,rating,inq,racount,inf)values(%s)"%(newstr) print(sql) #執行sql語句 cur.execute(sql) #提交事務 conn.commit() #關閉游標 cur.close() #關閉連接 conn.close()????print("保存完畢")結果文件:
爬取豆瓣TOP250的所有代碼
from bs4 import BeautifulSoup #頁面解析,獲取數據import re #正則表達式import urllib.request,urllib.error #指定URL,獲取頁面數據import xlwt #進行excel操作import sqlite3 #進行sql操作def main(): baseUrl = "https://movie.douban.com/top250?start=" #1.爬取網頁,并解析數據 dataList = getData(baseUrl) # savePath=".\\豆瓣電影Top250.xls" savePath = "movies.db" #2.保存數據 # saveData(dateList,savePath) savedb(dataList,savePath)#---正則表達式---#鏈接findLink = re.compile(r'',re.S)#電影名字findName = re.compile(r'(.*?)',re.S)#評分findRating = re.compile(r'(.*?)')#標題findInq = re.compile(r'(.*?)',re.S)#評分人數findCount = re.compile(r'(.*?)人評價')#電影信息findInf = re.compile(r'(.*?)
',re.S)#1.爬取網頁def getData(baseUrl): dataList = [] for i in range(10): html = askUrl(baseUrl + str(i * 25)) # 2.逐一解析數據 bs = BeautifulSoup(html,"html.parser") for item in bs.find_all('div',class_="item"): data = [] item = str(item) #鏈接 link = re.findall(findLink,item)[0] #名字 name = re.findall(findName,item) if len(name) == 1: cName = name[0] fName = " " else: name[1] = name[1].replace(" / ","") cName = name[0] fName = name[1] #評分 rating = re.findall(findRating,item)[0] #標題 inq = re.findall(findInq,item) if len(inq) < 1: inq = " " else: inq= inq[0] #評分人數 racount = re.findall(findCount,item)[0] #電影信息 inf = re.findall(findInf,item)[0] inf = re.sub("...(\s?)"," ",inf) inf = re.sub("/"," ",inf) inf = inf.strip() #添加一部電影的信息進data data.append(link) data.append(cName) data.append(fName) data.append(rating) data.append(inq) data.append(racount) data.append(inf) dataList.append(data) return dataList#爬取指定urldef askUrl(url): 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.3776.400 QQBrowser/10.6.4212.400"} request = urllib.request.Request(url = url,headers=head) http = "" try: response = urllib.request.urlopen(request) http = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e,"code"): print(e.code) if hasattr(e,"reson"): print(e.reson) return http# 3.保存數據def saveData(dataList,savePath): woke = xlwt.Workbook("utf-8",style_compression=0)#樣式的壓縮效果 sheet = woke.add_sheet("豆瓣電影Top250",cell_overwrite_ok=True)#覆蓋原單元格信息 col = ("鏈接","中文名字","英文名字","評分","標題","評分人數","概況") for i in range (7): sheet.write(0,i,col[i]) for i in range (0,250): for j in range (7): sheet.write(i+1,j,dataList[i][j]) print("第%d條數據"%(i+1)) woke.save(savePath) print("保存完畢")#3.保存到數據庫def savedb(dataList,dataPath): initdb(dataPath) conn = sqlite3.connect(dataPath) cur = conn.cursor() #開始保存數據 for data in dataList: for index in range(len(data)): data[index] = str('"'+data[index]+'"') newstr = ",".join(data) sql ="insert into movie(info_link,cname,fname,rating,inq,racount,inf)values(%s)"%(newstr) print(sql) cur.execute(sql) conn.commit() cur.close() conn.close() print("保存完畢")#3-1新建表def initdb(dataPath): conn = sqlite3.connect(dataPath) cur = conn.cursor() sql = ''' create table movie( id Integer primary key autoincrement, info_link text, cname varchar , fname varchar , rating varchar , inq text, racount varchar , inf text ) ''' cur.execute(sql) conn.commit() cur.close() conn.close()if __name__ == "__main__": #調用函數????main()
愉快爬蟲:
遵守 Robots 協議,但有沒有 Robots 都不代表可以隨便爬,可見下面的大眾點評百度案;
限制你的爬蟲行為,禁止近乎 DDOS的請求頻率,一旦造成服務器癱瘓,約等于網絡攻擊;
對于明顯反爬,或者正常情況不能到達的頁面不能強行突破,否則是 Hacker行為;
最后,審視清楚自己爬的內容,以下是絕不能碰的紅線(包括但不限于):
https://www.zhihu.com/question/291554395/answer/514982754
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。
END總結
以上是生活随笔為你收集整理的python request url 转义_Python爬虫入门笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件标识符必须为双精度类型的整数值标量_
- 下一篇: mysql如何逻辑删除_mysql逻辑删