国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python正則表達式爬取貓眼電影top100

2020-02-22 23:18:21
字體:
來源:轉載
供稿:網友

用正則表達式爬取貓眼電影top100,具體內容如下

#!/usr/bin/python # -*- coding: utf-8 -*-  import json  # 快速導入此模塊:鼠標先點到要導入的函數處,再Alt + Enter進行選擇 from multiprocessing.pool import Pool #引入進程池  import requests import re import csv from requests.exceptions import RequestException #引入異常  ## 正確保存,無丟失  # 請求一個頁面返回響應內容 #以《霸王別姬》為列,右擊—查看元素—會顯示一個網頁信息 def get_one_page(url,offset):  try:   response=requests.get(url=url,params={"offset":offset})   if response.status_code==200: #由狀態碼判斷返回結果,200表示請求成功,300,500表出錯    return response.text #返回網頁內容   else:return None  except RequestException as e:    return None  # 解析一個頁面 def parse_one_page(html):  pattern = ('<dd>.*?board-index.*?>(/d+)</i>.*?data-src="(.*?)".*?name"><a'        + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'        + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>')  #寫個正則,匹配所有結果。這里由上面的網頁相應內容寫<dd>開頭,.*?匹配任意字符穿 board-index匹配標識符,類名,  # /d 表數字即排名,'+'表示匹配至少一個可多個數字,</i>右邊結束符  #“?”,問號表示 非貪婪匹配,就是一旦匹配到就不在繼續往后面嘗試。  #而/(和/)分別表示匹配一個“(”和“)”  # re.S匹配多行  regex = re.compile(pattern,re.S) #一個方法,通過一個正則表達式字符串編譯生成一個正則表達式對象,re.S 匹配任意字符  items = regex.findall(html) #以列表形式返回全部能匹配的子串. eg: re.findall(pattern, string[, flags])  for item in items: #將結果以字典形式返回,鍵值對    yield{  #把這個方法變成一個生成器     'index':item[0],     'image':item[1],     'title':item[2],     'actor':item[3].strip()[3:], #用strip()去掉換行符,不想要 主演: 這三個字就用[3:]組成一個切片,name就可以將前三個字符串去掉     'time':get_release_time(item[4].strip()[5:]),  #去掉前五個字符     'area':get_release_area(item[4].strip()[5:]),     'score':item[5]+item[6] #將評分整數部分和小數部分結合起來   }  ''''' #保存到txt,會發現中文漢字變成了unic的編碼,加上encoding='utf-8',ensure_ascii=False,則漢字可正常輸出 def write_to_file(content):  with open('result.txt','a',encoding='utf-8') as f: # 參數 a ,表示直接往后追加   f.write(json.dumps(content,ensure_ascii=False) +'/n') #content是一個字典的形式,用json.dumps 把它轉換為字符串,再加個換行符   f.close()  #json.dumps :dict 轉換為 str #json.loads: str 轉換為 dict ''' '''''''' # 獲取上映時間 <p class="releasetime">上映時間:1993-01-01(中國香港)</p> def get_release_time(data):  pattern = '^(.*?)(/(|$)'  regex = re.compile(pattern)  w = regex.search(data)  return w.group(1) # group(1)指的是第一個括號里的東西  # 獲取上映地區 def get_release_area(data):  pattern = '.*/((.*)/)' #而/(和/)分別表示匹配一個 '(' 和 ')'  regex = re.compile(pattern)  w = regex.search(data)  if w is None:   return'未知'  return w.group(1)  # 獲取封面大圖,不需要 # def get_large_thumb(url): #  pattern = '(.*?)@.*?' #  regex = re.compile(pattern) #  w = regex.search(url) #  return w.group(1)  # 存儲數據 def store_data(item):  with open('movie.csv','a',newline='',encoding='utf-8') as data_csv:   # dialect為打開csv文件的方式,默認是excel,delimiter="/t"參數指寫入的時候的分隔符   csv_writer = csv.writer(data_csv)   csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']]) # 參數newline是用來控制文本模式之下,一行的結束字符??梢允荖one,'',/n,/r,/r/n等。 ''''' 也可判斷異常,一般沒錯   try:    csv_writer = csv.writer(data_csv)    csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']])   except Exception as e:    print(e)    print(item) '''  # 下載封面圖 #讀方式打開的話,并不會新建;寫方式打開的話就會新建。 r只讀,w可寫,a追加 def download_thumb(title,image):  try:   response = requests.get(image)   # 獲取二進制數據   with open('image/'+title+'.jpg', 'wb') as f: #將封面圖保存到當前路徑下的image文件夾中,圖片名稱為:電影名.jpg    f.write(response.content)    f.close()  except RequestException as e:   print(e)   pass   # 主調度程序 def main():  # 起始URL  start_url = 'http://maoyan.com/board/4?'  for i in range(0,1000,10):   # 獲取響應文本內容   html = get_one_page(url=start_url, offset=i)   if html is None:    print('鏈接:%s?offset=%s異常'.format(start_url,i))    continue   for item in parse_one_page(html):    # print(item)    store_data(item)    # download_thumb(item['title'],item['image']) #  if __name__=='__main__':  main()  ''''' if __name__=='__main__':  for i in range(10):   main(i*10) '''  ''''' if __name__=='__main__':  for i in range(10):   main(i*10)  pool=Pool() #可以提供指定數量的進程供用戶調用,如果有一個新的請求被提交到進程池,進程池還沒有滿,就會創建新的進程來執行請求,如果滿了,就先等待  pool.map(main,[i*10 for i in range(10)]) #將數組中的每一個元素拿出來當做函數的參數,然后創建一個個的進程,放到進程池里面去運行;第二個參數是構造一個數組,組成循環  #速度明顯變快!1s '''             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 饶河县| 洛阳市| 大连市| 城市| 洪江市| 缙云县| 宁德市| 余干县| 花莲市| 错那县| 康乐县| 岳普湖县| 柳江县| 石阡县| 阆中市| 文昌市| 眉山市| 建瓯市| 太原市| 台湾省| 渭南市| 潜江市| 襄城县| 阳泉市| 榆社县| 崇礼县| 邵东县| 大英县| 台中县| 泗阳县| 德安县| 祥云县| 武冈市| 兴国县| 乳山市| 开鲁县| 锡林郭勒盟| 靖远县| 吉首市| 泸水县| 扶绥县|