天天看點

使用requests庫實作豆瓣Top250電影資訊爬取+簡單使用多線程提高效率第一部分:直接擷取!!!1.目标URL:https://movie.douban.com/top250!2.python中利用requests+etree+re+json+fake_useragent子產品實作:(代碼沒有任何問題,可以随拿随用!)3.實作效果:可以完整正确無誤的擷取豆瓣Top250中的所有250部電影的目标資訊!第二部分:配合使用多線程提高效率!!!

第一部分:直接擷取!!!

1.目标URL:https://movie.douban.com/top250!

使用requests庫實作豆瓣Top250電影資訊爬取+簡單使用多線程提高效率第一部分:直接擷取!!!1.目标URL:https://movie.douban.com/top250!2.python中利用requests+etree+re+json+fake_useragent子產品實作:(代碼沒有任何問題,可以随拿随用!)3.實作效果:可以完整正确無誤的擷取豆瓣Top250中的所有250部電影的目标資訊!第二部分:配合使用多線程提高效率!!!

2.python中利用requests+etree+re+json+fake_useragent子產品實作:(代碼沒有任何問題,可以随拿随用!)

import requests
from lxml import etree
import re
import json
from fake_useragent import UserAgent

def films(num):
    page_url="https://movie.douban.com/top250?start={}&filter=".format(num)
    # 添加UA以防最基礎的UA反爬!
    headers={
        "User-Agent": UserAgent().random
    }
    res=requests.get(page_url,headers=headers)

    # 解析資料
    html=etree.HTML(res.text)
    # 定義空字典:存放處理過後的目标資料!
    film_info = {}
    films_info = html.xpath("//div[@class='info']")
    # 一次打開檔案,寫完全部目标資料後再進行關閉檔案,節省資源!
    with open("films_info.json", 'a',encoding='utf-8') as f:
        for film_one in films_info:
            # 電影名稱
            film_name = film_one.xpath("./div/a/span[1]/text()")[0]
            # 電影導演+主演       注意:電影導演和主演在網頁中是放在同一個p标簽下,是以要進行特殊處理!
            film_author_actor = film_one.xpath("./div[2]/p/text()")[0].strip()
            # 電影導演            反複觀察可知:if中的為電影導演和主演靠三個\xa0,即空格分開,電影導演在前!    else中的為電影資訊隻有導演,連主演的主都沒的!
            if "主" in film_author_actor:
                film_author_test = re.findall(': (.*)\\xa0',film_author_actor)[0].strip()
                film_author = re.sub('\\xa0','',film_author_test)
            else:
                film_author_test = re.findall(': (.*)',film_author_actor)[0]
                film_author = re.sub('\\xa0', '', film_author_test)
            # 電影主演             注意:有個别電影沒有主演資訊!(僅有一個主字或者主演兩個字的!通過if篩選掉!)
            if "主演" in film_author_actor and len(re.findall('\\xa0主演: (.*)',film_author_actor))==1:
                film_actor_test = re.findall('\\xa0主演: (.*)',film_author_actor)[0].strip()
                film_actor = re.sub('\\xa0','',film_actor_test)
            else:
                film_actor = "空"
            # 電影分類             注意:分類資訊中有些不必要的空格,通過re中的sub方法删除!
            film_category_test = film_one.xpath("./div[2]/p/text()")[1].strip()
            film_category = re.sub('\\xa0','',film_category_test)
            # 電影評分
            film_score = film_one.xpath("./div[2]/div/span[2]/text()")[0]

            # 将資料放入字典!
            film_info["film_name"] = film_name
            film_info["film_author"] = film_author
            film_info["film_actor"] = film_actor
            film_info["film_category"] = film_category
            film_info["film_score"] = film_score

            # 序列化的過程:将字典格式轉為json格式
            content = json.dumps(film_info,ensure_ascii=False) + "," + "\n"
            f.write(content)

for i in range(9):
    films(i*25)

           

3.實作效果:可以完整正确無誤的擷取豆瓣Top250中的所有250部電影的目标資訊!

使用requests庫實作豆瓣Top250電影資訊爬取+簡單使用多線程提高效率第一部分:直接擷取!!!1.目标URL:https://movie.douban.com/top250!2.python中利用requests+etree+re+json+fake_useragent子產品實作:(代碼沒有任何問題,可以随拿随用!)3.實作效果:可以完整正确無誤的擷取豆瓣Top250中的所有250部電影的目标資訊!第二部分:配合使用多線程提高效率!!!

第二部分:配合使用多線程提高效率!!!

關于線程的講解!

# 協程:微線程  可以單線程實作任務切換

# 多程序,多線程,多協程:目的都是提高效率。

# 多程序:适用于CPU密集型(比如:計算,圖形處理)
# 多線程:适用于IP密集型(比如:http請求,檔案打開關閉)
# 爬蟲就可以了解為IP密集型!
           
import requests
from lxml import etree
import re
import json
from fake_useragent import UserAgent
import time
import threading

# for循環是順序執行,有一個需求:使用多線程完成10個頁面并行擷取

def films(num):
    page_url="https://movie.douban.com/top250?start={}&filter=".format(num)
    # 添加UA以防最基礎的UA反爬!
    headers={
        "User-Agent": UserAgent().random
    }
    res=requests.get(page_url,headers=headers)

    # 解析資料
    html=etree.HTML(res.text)
    # 定義空字典:存放處理過後的目标資料!
    film_info = {}
    films_info = html.xpath("//div[@class='info']")
    # 一次打開檔案,寫完全部目标資料後再進行關閉檔案,節省資源!
    with open("films_info.json", 'a',encoding='utf-8') as f:
        for film_one in films_info:
            # 電影名稱
            film_name = film_one.xpath("./div/a/span[1]/text()")[0]
            # 電影導演+主演       注意:電影導演和主演在網頁中是放在同一個p标簽下,是以要進行特殊處理!
            film_author_actor = film_one.xpath("./div[2]/p/text()")[0].strip()
            # 電影導演            反複觀察可知:if中的為電影導演和主演靠三個\xa0,即空格分開,電影導演在前!    else中的為電影資訊隻有導演,連主演的主都沒的!
            if "主" in film_author_actor:
                film_author_test = re.findall(': (.*)\\xa0',film_author_actor)[0].strip()
                film_author = re.sub('\\xa0','',film_author_test)
            else:
                film_author_test = re.findall(': (.*)',film_author_actor)[0]
                film_author = re.sub('\\xa0', '', film_author_test)
            # 電影主演             注意:有個别電影沒有主演資訊!(僅有一個主字或者主演兩個字的!通過if篩選掉!)
            if "主演" in film_author_actor and len(re.findall('\\xa0主演: (.*)',film_author_actor))==1:
                film_actor_test = re.findall('\\xa0主演: (.*)',film_author_actor)[0].strip()
                film_actor = re.sub('\\xa0','',film_actor_test)
            else:
                film_actor = "空"
            # 電影分類             注意:分類資訊中有些不必要的空格,通過re中的sub方法删除!
            film_category_test = film_one.xpath("./div[2]/p/text()")[1].strip()
            film_category = re.sub('\\xa0','',film_category_test)
            # 電影評分
            film_score = film_one.xpath("./div[2]/div/span[2]/text()")[0]

            # 将資料放入字典!
            film_info["film_name"] = film_name
            film_info["film_author"] = film_author
            film_info["film_actor"] = film_actor
            film_info["film_category"] = film_category
            film_info["film_score"] = film_score

            # 序列化的過程:将字典格式轉為json格式
            content = json.dumps(film_info,ensure_ascii=False) + "," + "\n"
            f.write(content)

start_time = time.time()
# 注意:因為使用的是多線程,是以擷取的10頁資料是不按順序來的!
for i in range(10):
    thread_douban = threading.Thread(target=films,args=(i*25,))
    thread_douban.start()
    thread_douban.join()

end_time = time.time()
print(end_time-start_time)