通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python爬虫如何构造字典存储参数

python爬虫如何构造字典存储参数

在使用Python编写爬虫时,构造字典存储参数的过程是非常重要的,主要包括:定义字典、动态更新字典、解析响应并存储数据。首先,定义一个字典来存储初始参数值;然后在不同阶段,根据需要动态更新字典中的参数;最后,在解析响应数据时,将所需数据存储在字典中,以便后续使用或保存。定义一个字典并动态更新是构造字典存储参数的关键步骤

一、定义字典并存储初始参数

在爬虫脚本中,首先定义一个字典来存储初始参数。这些参数可能包括请求头、查询参数、表单数据等。例如:

params = {

'query': 'Python',

'page': 1,

'limit': 10,

}

这个字典params包含了查询关键词、页数和每页的结果数量。在发送请求时,可以直接使用这个字典。

二、动态更新字典参数

在爬虫过程中,可能需要动态更新字典中的参数。例如,在翻页时,需要更新页数参数。这时可以使用以下方式:

for page in range(1, 6):

params['page'] = page

response = requests.get(url, params=params)

# 处理响应数据

通过这种方式,可以方便地在循环中更新字典中的参数,并发送请求。

三、解析响应并存储数据

在获取到响应后,解析响应数据并存储在字典中。例如,获取网页中的文章标题和链接:

import requests

from bs4 import BeautifulSoup

url = 'https://example.com/search'

params = {

'query': 'Python',

'page': 1,

'limit': 10,

}

data = []

for page in range(1, 6):

params['page'] = page

response = requests.get(url, params=params)

soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.find_all('article')

for article in articles:

title = article.find('h2').get_text()

link = article.find('a')['href']

data.append({'title': title, 'link': link})

输出爬取的数据

print(data)

在这个示例中,data是一个列表,每个元素是一个字典,包含文章的标题和链接。这些字典存储了我们需要的数据,可以方便地进行后续处理。

四、使用函数封装代码

为了提高代码的可读性和复用性,可以将上述过程封装到函数中。例如:

import requests

from bs4 import BeautifulSoup

def fetch_articles(query, pages=5, limit=10):

url = 'https://example.com/search'

params = {

'query': query,

'page': 1,

'limit': limit,

}

data = []

for page in range(1, pages + 1):

params['page'] = page

response = requests.get(url, params=params)

soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.find_all('article')

for article in articles:

title = article.find('h2').get_text()

link = article.find('a')['href']

data.append({'title': title, 'link': link})

return data

调用函数

articles = fetch_articles('Python')

print(articles)

通过封装成函数,可以更方便地调用和测试,提高代码的可维护性。

五、处理复杂参数结构

在某些情况下,参数结构可能比较复杂,例如嵌套的字典或列表。这时,可以使用递归函数来处理。例如,构造一个包含嵌套结构的参数字典:

params = {

'query': 'Python',

'filters': {

'date': {

'from': '2023-01-01',

'to': '2023-12-31',

},

'tags': ['programming', 'development'],

},

'page': 1,

'limit': 10,

}

在发送请求时,需要将字典转换为适合URL编码的格式,可以使用urllib.parse模块中的urlencode函数:

import urllib.parse

def dict_to_query_string(params, prefix=''):

query_string = ''

for key, value in params.items():

if isinstance(value, dict):

query_string += dict_to_query_string(value, prefix + key + '.')

elif isinstance(value, list):

for i, v in enumerate(value):

query_string += dict_to_query_string({f'{key}[{i}]': v}, prefix)

else:

query_string += f'{prefix}{key}={urllib.parse.quote(str(value))}&'

return query_string

query_string = dict_to_query_string(params)

query_string = query_string.rstrip('&')

url = f'https://example.com/search?{query_string}'

response = requests.get(url)

通过递归函数dict_to_query_string,可以将嵌套的字典转换为适合URL编码的查询字符串。

六、使用Session管理请求

在爬虫过程中,使用requests.Session可以复用TCP连接,减少请求开销,并管理会话数据。例如:

import requests

from bs4 import BeautifulSoup

def fetch_articles(query, pages=5, limit=10):

url = 'https://example.com/search'

params = {

'query': query,

'page': 1,

'limit': limit,

}

data = []

with requests.Session() as session:

for page in range(1, pages + 1):

params['page'] = page

response = session.get(url, params=params)

soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.find_all('article')

for article in articles:

title = article.find('h2').get_text()

link = article.find('a')['href']

data.append({'title': title, 'link': link})

return data

调用函数

articles = fetch_articles('Python')

print(articles)

通过使用Session对象,可以提高爬虫的效率和稳定性。

七、处理反爬虫机制

在实际爬虫过程中,可能会遇到反爬虫机制,例如IP封禁、验证码等。为了应对这些问题,可以采用以下方法:

  1. 设置请求头:模拟浏览器请求,设置合适的User-Agent等头信息。

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',

}

response = requests.get(url, headers=headers, params=params)

  1. 使用代理IP:通过代理IP池,避免IP被封禁。

proxies = {

'http': 'http://10.10.1.10:3128',

'https': 'http://10.10.1.10:1080',

}

response = requests.get(url, headers=headers, params=params, proxies=proxies)

  1. 设置请求间隔:避免频繁请求导致IP封禁,设置合理的请求间隔。

import time

for page in range(1, pages + 1):

params['page'] = page

response = requests.get(url, headers=headers, params=params)

time.sleep(1) # 设置请求间隔

# 处理响应数据

  1. 处理验证码:遇到验证码时,可以尝试使用OCR技术识别验证码,或手动解决验证码。

from PIL import Image

import pytesseract

response = requests.get('https://example.com/captcha')

with open('captcha.png', 'wb') as f:

f.write(response.content)

captcha_text = pytesseract.image_to_string(Image.open('captcha.png'))

print(captcha_text)

八、存储爬取的数据

在爬取数据后,需要将数据存储到文件或数据库中,以便后续分析和处理。可以使用CSV、JSON、数据库等方式存储数据。例如,存储数据到CSV文件:

import csv

def save_to_csv(data, filename):

with open(filename, mode='w', newline='', encoding='utf-8') as file:

writer = csv.DictWriter(file, fieldnames=data[0].keys())

writer.writeheader()

writer.writerows(data)

调用函数

save_to_csv(articles, 'articles.csv')

或者存储数据到JSON文件:

import json

def save_to_json(data, filename):

with open(filename, mode='w', encoding='utf-8') as file:

json.dump(data, file, ensure_ascii=False, indent=4)

调用函数

save_to_json(articles, 'articles.json')

九、使用数据库存储数据

在处理大量数据时,使用数据库存储可以提高数据管理的效率。例如,使用SQLite数据库存储数据:

import sqlite3

def save_to_db(data, db_name):

conn = sqlite3.connect(db_name)

cursor = conn.cursor()

cursor.execute('''

CREATE TABLE IF NOT EXISTS articles (

id INTEGER PRIMARY KEY AUTOINCREMENT,

title TEXT,

link TEXT

)

''')

for article in data:

cursor.execute('''

INSERT INTO articles (title, link) VALUES (?, ?)

''', (article['title'], article['link']))

conn.commit()

conn.close()

调用函数

save_to_db(articles, 'articles.db')

通过这种方式,可以方便地将数据存储到数据库中,便于后续查询和分析。

十、处理异常和错误

在爬虫过程中,可能会遇到各种异常和错误,例如网络错误、解析错误等。为了保证爬虫的稳定性,需要进行异常处理。例如:

import requests

from requests.exceptions import RequestException

from bs4 import BeautifulSoup

def fetch_articles(query, pages=5, limit=10):

url = 'https://example.com/search'

params = {

'query': query,

'page': 1,

'limit': limit,

}

data = []

with requests.Session() as session:

for page in range(1, pages + 1):

params['page'] = page

try:

response = session.get(url, params=params)

response.raise_for_status() # 检查HTTP状态码

soup = BeautifulSoup(response.text, 'html.parser')

articles = soup.find_all('article')

for article in articles:

title = article.find('h2').get_text()

link = article.find('a')['href']

data.append({'title': title, 'link': link})

except RequestException as e:

print(f'Error fetching page {page}: {e}')

continue

return data

调用函数

articles = fetch_articles('Python')

print(articles)

通过这种方式,可以捕获并处理请求异常,保证爬虫的稳定运行。

总结

构造字典存储参数是Python爬虫的基本操作,通过定义字典、动态更新、解析响应并存储数据,可以有效地管理爬虫的参数和数据。通过使用函数封装、处理复杂参数结构、使用Session管理请求、应对反爬虫机制、存储数据以及处理异常错误,可以提高爬虫的效率、稳定性和可维护性。

相关问答FAQs:

如何在Python爬虫中构造字典来存储请求参数?
在Python爬虫中,字典是一种非常方便的数据结构,可以用于存储请求参数。使用字典时,可以将参数名作为键,参数值作为值,示例如下:

params = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}

在发送请求时,可以将这个字典作为参数传递,确保请求能够正确识别所需的参数。

使用字典存储参数时,有哪些常见的最佳实践?
在构造字典时,确保键的命名清晰且具有描述性,以便于理解和维护。避免使用过于简短或模糊的键名。同时,保持字典的结构简洁,尽量避免嵌套过深,以便于后期的修改和读取。此外,确保对字典中的值进行必要的类型检查,以避免因数据类型不匹配导致的请求失败。

在Python爬虫中,如何处理字典中的特殊字符?
在存储参数时,如果值中包含特殊字符(如空格、中文或其他符号),可以使用urllib.parse.quote函数进行编码。这样可以确保请求能够正确发送。例如:

import urllib.parse

value = "中文参数"
encoded_value = urllib.parse.quote(value)
params = {
    'key': encoded_value
}

这样做能够避免因为特殊字符导致的请求错误,提高爬虫的稳定性。

相关文章