使用xpath爬取豆瓣电影的图片代码
时间: 2024-11-28 07:26:36 浏览: 9
在Python中使用XPath进行网页爬虫时,通常需要先通过requests库获取网页内容,然后利用BeautifulSoup解析HTML,最后使用lxml库的ElementTree模块来应用XPath表达式查找特定元素。以下是一个简单的示例,假设你想从豆瓣电影页面抓取电影图片链接:
```python
import requests
from bs4 import BeautifulSoup
from lxml import etree
# 获取网页源码
url = 'https://movie.douban.com/top250'
response = requests.get(url)
content = response.text
# 解析HTML
soup = BeautifulSoup(content, 'html.parser')
# 将BeautifulSoup对象转换为lxml.etree.ElementTree对象
root = etree.fromstring(soup.prettify())
# 使用XPath表达式定位电影图片节点,这里假设图片URL都在img标签的'data-src'属性里
image_xpath = './/img[@class="cover"]/@data-src'
images = root.xpath(image_xpath)
for image in images:
print("Image URL:", image)
相关问题
爬取豆瓣前250部电影图片并保存用selenium方法Python 代码
在Python中使用Selenium库爬取豆瓣电影Top250的图片,并保存到本地,首先需要安装必要的库,如`webdriver_manager`, `selenium`, 和 `requests`。以下是一个简单的示例代码,它假设你已经下载了ChromeDriver:
```python
from selenium import webdriver
import os
from webdriver_manager.chrome import ChromeDriverManager
# 定义URL和图片保存路径
base_url = 'https://movie.douban.com/top250'
image_dir = 'douban_movie_images'
if not os.path.exists(image_dir):
os.makedirs(image_dir)
def get_image(url, save_path):
# 创建一个新的浏览器实例
driver = webdriver.Chrome(ChromeDriverManager().install())
try:
driver.get(url)
img_tag = driver.find_element_by_xpath('//img[@class="cover"]') # 查找电影海报元素
image_url = img_tag.get_attribute('src') # 获取图片链接
response = requests.get(image_url, stream=True) # 使用requests获取图片
with open(save_path, 'wb') as f:
for chunk in response.iter_content(1024): # 分块写入文件,防止内存溢出
if chunk:
f.write(chunk)
print(f"Image saved to {save_path}")
finally:
driver.quit() # 关闭浏览器
# 遍历第一页的电影图片链接
for i in range(1, 26):
movie_url = f"{base_url}?start={i*24}"
image_name = f'douban_movie_{i}.jpg' # 图片命名规则,你可以自定义
save_path = os.path.join(image_dir, image_name)
get_image(movie_url, save_path)
# 如果你想爬取更多页面,可以修改循环条件,例如start参数每次增加24(因为每页显示24部电影)
```
这个脚本会爬取首页的前250部电影图片,如果电影列表超过250条,你需要递归地更新`start`参数继续爬取。
import requests from lxml import etree import csv import os import pandas as pd import matplotlib.pyplot as plt class MovieDataCollector: def __init__(self): self.url = "https://movie.douban.com/top250?start=%s&filter=" self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } self.urls = ['https://movie.douban.com/top250?start={}&filter='.format(str(i * 25)) for i in range(10)] self.movies_data = [] def get_first_text(self, element_list): try: return element_list[0].strip() except IndexError: return "" def download_image(self, url, title): response = requests.get(url) image_name = f'{title.replace("/", "_")}.jpg' image_path = os.path.join('films_pic', image_name) with open(image_path, 'wb') as f: f.write(response.content) def scrape_movie_data(self): count = 1 for url in self.urls: res = requests.get(url=url, headers=self.headers) print(res.status_code) html = etree.HTML(res.text) lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li') print('当前是第{}页'.format(count)) for li in lis: rank = self.get_first_text(li.xpath('./div/div[1]/em/text()')) title = self.get_first_text(li.xpath('./div/div[2]/div[1]/a/span[1]/text()')) director = self.get_first_text(li.xpath('./div/div[2]/div[2]/p[1]/text()')) score = self.get_first_text(li.xpath('./div/div[2]/div[2]/div/span[2]/text()')) comment = self.get_first_text(li.xpath('./div/div[2]/div[2]/div/span[4]/text()')) # #下载电影图片 # image_url = self.get_first_text(li.xpath('./div/div[1]/a/img/@src')) # self.download_image(image_url, title) self.movies_data.append({ '排名': rank,解释这段代码
这段代码是一个Python类,名为MovieDataCollector,该类定义了一个用于爬取豆瓣电影Top250排行榜信息的方法scrape_movie_data。该方法首先定义了一个计数器count,用于记录当前爬取的是第几页的电影数据,然后遍历self.urls列表,该列表包含了豆瓣电影Top250排行榜的前10页的URL地址。对于每个URL,该方法发送HTTP请求获取HTML文档,然后使用XPath表达式选取页面中的电影信息,包括电影排名、电影名称、导演、评分和评价人数等信息,并将这些信息保存到一个字典中,再将字典添加到self.movies_data列表中。在获取电影信息的过程中,还调用了一个名为get_first_text的方法,该方法用于选取XPath表达式所匹配的元素列表中的第一个元素,并返回该元素的文本内容。除此之外,还有一个名为download_image的方法,该方法用于下载电影海报图片。
阅读全文