for page in range(0, 10):#根据网页规律,用for循环构建 page=page*10 time.sleep(10) #获取正确url网络地址 url = f'https://www.maoyan.com/board/4?timeStamp=20&offset={page}' headers = { 'Cookie':'__mta=250911417.1684852683551.1684857857025.1684857868530.6; ci=59%2C%E6%88%90%E9%83%BD; ci.sig=6-eKn999I8699yCUqmUVkEAA3RA; featrues=[object Object]; featrues.sig=KbQquuOrr42L3kMHbtKc319ems8; _lxsdk_cuid=188490b5844c8-0dc2de72154915-3e604809-144000-188490b5845c8; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1684852660; uuid_n_v=v1; uuid=6A080B90F97711EDB1C0EF0226805F3B350AFA999F724C6B9013F8578B9E816D; _csrf=c33def8c4b7063982594d90e32c67030753d41029d577dd8c0b7300fd842a5fd; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk=6A080B90F97711EDB1C0EF0226805F3B350AFA999F724C6B9013F8578B9E816D; __mta=250911417.1684852683551.1684852690037.1684856768008.4; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1684857868; _lxsdk_s=188494a0542-07b-504-ec2%7C%7C8', 'Host':'www.maoyan.com', 'Referer':'https://www.maoyan.com/board?timeStamp=1684853042241&channelId=40011&index=1&signKey=683c07ec69bec48fc2589b25eec30cf8&sVersion=1&webdriver=false', #防盗链,表示从哪个页面过来的 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', }
时间: 2024-01-24 07:18:39 浏览: 167
这段代码是构建请求头信息,其中包括Cookie、Host、Referer和User-Agent等信息,这些信息可以帮助我们模拟浏览器发送请求,避免被网站屏蔽。其中的url变量是根据页面规律构建的请求地址,通过for循环遍历页面,每次获取10个电影信息。time.sleep(10)是为了避免频繁访问网站被封禁IP。
相关问题
import requests from lxml import etree from selenium import webdriver from selenium.webdriver.common.by import By import os import time import threading url = 'https://www.ivsky.com/' #目标网址 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' } path = r'C:\Users\yangyuhuan\AppData\Local\Google\Chrome\Application\chromedriver' driver = webdriver.Chrome(executable_path=path) #申请驱动器 if not os.path.exists("./images"): os.mkdir("./images2") #创建结果文件夹 def download_image(src, name): img_url = "https:" + src res3 = requests.get(img_url, headers=headers).content #获取图片的二进制文件 time.sleep(3) print(f'正在下载:{name}') with open('./images/' + name + '.jpg', 'wb') as f: f.write(res3) def download_page(page): url = f"https://www.ivsky.com/bizhi/index_{page}.html" driver.get(url) response = driver.page_source # 获取网页源码 html = etree.HTML(response)# 对网页结构进行解析 time.sleep(3) src_image_result=html.xpath('//div[@class="il_img"]/a/img/@src') name_image_result=html.xpath('//div[@class="il_img"]/a/img/@alt') threads = [] for src,name in zip(src_image_result,name_image_result): t = threading.Thread(target=download_image, args=(src, name)) threads.append(t) t.start() for thread in threads: thread.join() for page in range(10):# 页码 download_page(page) driver.quit()对这个代码进行逐句的具体分析
这段代码的作用是爬取 https://www.ivsky.com/ 网站上的图片,并将其保存在本地文件夹中。
具体分析如下:
1. 导入必要的模块
```
import requests
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time
import threading
```
- requests:用于发送 HTTP 请求并获取响应内容。
- lxml:用于对 HTML/XML 文档进行解析和处理。
- selenium:用于自动化测试,可以模拟用户在浏览器中的操作。
- os:用于操作文件和目录。
- time:用于添加延迟,防止频繁访问网站被封 IP。
- threading:用于实现多线程操作。
2. 设置目标网址和请求头
```
url = 'https://www.ivsky.com/' #目标网址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
```
- 目标网址:需要爬取的网站链接。
- 请求头:模拟浏览器发送请求的头部信息,防止被网站识别为爬虫并拒绝访问。
3. 设置本地文件夹路径和 Chrome 驱动器路径
```
path = r'C:\Users\yangyuhuan\AppData\Local\Google\Chrome\Application\chromedriver' # Chrome 驱动器路径
driver = webdriver.Chrome(executable_path=path) #申请驱动器
if not os.path.exists("./images"):
os.mkdir("./images") #创建结果文件夹
```
- path:Chrome 驱动器的路径。
- driver:使用 Chrome 驱动器打开网页。
- os.mkdir():创建存储图片的文件夹。
4. 定义下载图片函数
```
def download_image(src, name):
img_url = "https:" + src
res3 = requests.get(img_url, headers=headers).content #获取图片的二进制文件
time.sleep(3)
print(f'正在下载:{name}')
with open('./images/' + name + '.jpg', 'wb') as f:
f.write(res3)
```
- src:图片的链接地址。
- name:图片的名称。
- img_url:拼接完整的图片链接地址。
- requests.get():发送 GET 请求获取图片的二进制文件。
- time.sleep():添加延迟,防止频繁访问网站被封 IP。
- with open():将获取的图片二进制文件写入本地文件中。
5. 定义下载每一页的函数
```
def download_page(page):
url = f"https://www.ivsky.com/bizhi/index_{page}.html"
driver.get(url)
response = driver.page_source # 获取网页源码
html = etree.HTML(response)# 对网页结构进行解析
time.sleep(3)
src_image_result=html.xpath('//div[@class="il_img"]/a/img/@src')
name_image_result=html.xpath('//div[@class="il_img"]/a/img/@alt')
threads = []
for src,name in zip(src_image_result,name_image_result):
t = threading.Thread(target=download_image, args=(src, name))
threads.append(t)
t.start()
for thread in threads:
thread.join()
```
- page:需要下载的网页页码。
- url:拼接目标网站的每一页链接地址。
- driver.get():使用 Chrome 驱动器打开每一页。
- driver.page_source:获取每一页的 HTML 源码。
- etree.HTML():对每一页的 HTML 源码进行解析。
- src_image_result 和 name_image_result:通过 xpath 解析出每一页的图片链接地址和名称。
- threading.Thread():创建一个线程,使用 download_image() 函数下载图片。
- threads.append():将线程加入线程池。
- t.start():启动线程。
- thread.join():等待线程执行完毕。
6. 循环遍历每一页并下载图片
```
for page in range(10): # 页码
download_page(page)
driver.quit()
```
- range(10):循环遍历前 10 页。
- download_page():下载每一页的图片。
- driver.quit():关闭 Chrome 驱动器。
import requests from lxml import etree import time import random import json class DoubanSpider: def __init__(self): # 基准url self.url = "https://movie.douban.com/top250?start={}" # 请求头 self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'} def get_html(self, url): # 发送请求,得到响应对象 resp = requests.get(url=url, headers=self.headers) # 返回响应字符串 return resp.content.____(1)____ def parse_page(self, html): # 得到XPath解析对象 p = ____(2)____ # 获取li节点列表 li_list = p.____(3)____('//ol[@class="grid_view"]/li') # 初始化一个空列表 movies_lst = [] # 遍历li节点 for li in li_list: # 创建一个空字典 item = {} # 电影名 item['name'] = li.xpath('.//span[@class="title"]/text()')____(4)____.strip() # 评分 item['score'] = li.xpath('.//span[@class="rating_num"]/text()')____(4)____.strip() # 评论数 item['comment_num'] = li.xpath('.//div[@class="star"]/span[4]/text()')____(4)____.strip() print(item) # 将每一部电影追加到列表中 movies_lst.____(5)____(item) return movies_lst def run(self): # 定义一个空列表 movies = [] for page in range(10): # 拼接每一页的url url = self.url.____(6)____(page * 25) # 向url发送请求获取响应内容 html = self.get_html(url) # 得到每一页的电影列表 movie_lst = self.parse_page(html) # 将电影列表加入movies中 movies.____(7)____(movie_lst) # 随机休眠1-2秒 time.____(8)____(random.randint(1, 2)) # 以写模式打开douban.json,编码方式为utf-8 with open('douban.json', __(9)__, encoding='utf-8') as f: # 将电影写入json文件中 json.__(10)_(movies, f, ensure_ascii=False, indent=2) if __name__ == "__main__": # 创建spider对象 spider = DoubanSpider() # 调用对象的run方法 spider.run()
1. 使用 `.text` 方法获取响应字符串。
2. 使用 `etree.HTML(html)` 方法得到XPath解析对象。
3. 使用 `.xpath()` 方法获取li节点列表。
4. 使用 `[0]` 取出列表中的第一个元素,并使用 `.strip()` 方法去除多余空格。
5. 使用 `.append()` 方法将每一部电影追加到列表中。
6. 使用 `.format()` 方法拼接每一页的url。
7. 使用 `.extend()` 方法将每一页的电影列表加入movies中。
8. 使用 `time.sleep()` 方法随机休眠1-2秒。
9. 使用 `'w'` 模式打开douban.json文件。
10. 使用 `json.dump()` 方法将电影列表写入json文件中。
阅读全文