看到他們說使用 xpath 定位元素比較可靠然後自己嘗試着修改用正則來提取貓眼電影的數據,話不多說進入正題
導入相關的庫
import requests
from requests.exceptions import RequestException
from multiprocessing import Pool
from lxml import etree
嘗試着獲取頁面的內容
def get_one_page(url):
try:
headers = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
response = requests.get(url=url,headers = headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
加了個簡單的異常處理
通過xpath匹配獲取需要的內容
def parse_one_page(html):
tree = etree.HTML(html)
for num in range(1,11):
index = ''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/i/text()'.format(num)))
title = ''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/div/div/div[1]/p[1]/a/text()'.format(num)))
actor =(''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/div/div/div[1]/p[2]/text()'.format(num)))).strip()
time = ''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/div/div/div[1]/p[3]/text()'.format(num)))
score =''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/div/div/div[2]/p/i[1]/text()'.format(num))) + ''.join(tree.xpath('//*[@id="app"]/div/div/div[1]/dl/dd[{}]/div/div/div[2]/p/i[2]/text()'.format(num)))
data = index + ' ' + title + ' ' + actor + ' ' + time + ' ' +score
write_to_file(data)
因爲每頁是十部電影的內容 通過循環獲取當前頁面的所有 排名 電影名字 主演
上映時間 評分 xpath匹配得到的數據是列表類型 我將它轉換成字符串類型進行操作 然後將每部電影的內容整合到data中
寫入文件
def write_to_file(content):
with open(r"E:\python\爬蟲\data.txt","a",encoding="utf-8") as f:
f.write(content + '\n')
在parse_one_page這個函數中 每次獲取到一個電影的內容將它以追加的形式寫入文件
main()
def main(offset):
url = r"http://maoyan.com/board/4?offset=" + str(offset)
html = get_one_page(url)
parse_one_page(html)
if __name__ == "__main__":
# 1 用循環對其他頁面的抓取
for i in range(10):
main(10*i)
# 2 使用進程池加快抓取效率
# pp = Pool()
# pp.map(main,[i*10 for i in range(10)])
兩種方式對其他頁面的抓取
文件中數據的截圖
歡迎大家對我程序的漏洞提出建議 謝謝