爬取网站-1022

4

防止出现访问超时,退出问题,设置一个重试机制:

"""
retries=5:最大重试次数,默认为5次
backoff_factor=1:重试之间的延迟因子,用于计算每次重试的等待时间
status_forcelist=(500, 502, 504):触发重试的HTTP状态码列表
500:服务器内部错误
502:错误网关
504:网关超时
"""
def create_session_with_retries(retries=5, backoff_factor=1, status_forcelist=(500, 502, 504)):
    session = requests.Session()

"""
total:总重试次数上限
read:读取超时时的重试次数
connect:连接超时时的重试次数
backoff_factor:延迟因子,用于计算重试之间的等待时间
status_forcelist:当收到这些状态码时触发重试
"""

    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

1.爬取网站;

  1. 给网站命名参数;

  2. 设置表头;

  3. 请求数据;

try:
    response = requests.get(base_url, headers = headers, timeout=30)
    print(f"请求成功,输出状态码:{response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"请求失败!:{e}")
    exit()

2.解析数据;

soup = BeautifulSoup(response.text, 'html.parser')
# 查找符合内容
items = soup.find_all('div', class_=re.compile(r'tile.*content'))

3.存储数据;

df = pd.DataFrame(data)
# mode='a',代表追加
df.to_csv('scrapers_zhixuan.csv',mode='a', index=False, header=False)

详细代码知识点整理

1.读取网站

base_url = "https://zxcs.zip/rank/topdownload?page=i"

2.设置表头

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}

3.requests库发送 HTTP GET 请求

    try:
        response = requests.get(base_url, headers = headers, timeout=30)
        print(f"请求成功,输出状态码:{response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"请求失败!:{e}")
        exit()

4.解析数据

1)解析HTML文档

response.text作用​​:包含服务器返回的原始HTML内容

'html.parser'​作用​​:指定HTML解析器

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

2)查找符合条件的html

find_all查找所有html标签类型为div,属性class_为符合条件的正则表达式。find_all(class_='')也可以。

正则表达式补充:

r:转义;

.*:一个或多个任意字符;

items = soup.find_all('div', class_=re.compile(r'tile.*content'))

3)find用法

find是查找单个符合条件的;find_all查找多个符合条件的,返回列表。

4)strip用法

默认去除字符串首尾两端的特定字符串。返回新字符串,原字符串不变。

移除的默认空白符包括:

  • 空格 ' '

  • 制表符 \t

  • 换行符 \n

  • 回车符 \r

  • 垂直制表符 \v

  • 换页符 \f

例子:

text = ' d dd'

print(text.strip())

'd dd'

5)split用法

str.split(sep=None, maxsplit=-1)
text = '    Hello   World  Python'
print(text.split())
['Hello', 'World', 'Python']
  • ​参数​​:

    • sep:分隔符,默认为None(按空白字符分割)

    • maxsplit:最大分割次数,默认为-1(全部分割)

  • ​返回值​​:返回分割后的字符串列表

  • 按任意长度的空白字符分割(包括空格、制表符、换行符等)

  • 自动忽略字符串开头和结尾的空白

  • 连续空白视为单个分隔符