今天有同学问我为什么信息提取不出来?

下面是同学的源代码:

import requests
from bs4 import BeautifulSoup

start_url = "http://tieba.baidu.com/p/4957100148"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER"}
response = requests.get(start_url,headers = headers).text
soup  = BeautifulSoup(response,"html.parser")
infos = soup.select('div.d_post_content j_d_post_content  clearfix')

他是同find方法,找的div的class标签,对于这个问题,我们可以换个思路,这个定位找不到,就往上找,我的代码:

import requests
from bs4 import BeautifulSoup

start_url = "http://tieba.baidu.com/p/4957100148"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER"}
response = requests.get(start_url,headers = headers).text
soup  = BeautifulSoup(response,"html.parser")
infos = soup.select('cc > div')
for info in infos:
    print(info.get_text().strip())

分享一个简单爬虫_Chrome

总结:各种爬取方法都需要灵活使用。

关于图片爬虫完整代码

'''
Method:
1. 根据 url 的规律指定爬取页面
2. 解析 html 获得当前页面所有图片 url
3. 进入图片之后,再次解析 html 获得原始图片的 url
4. get 原始图片的 url 并保存到本地
'''

import os
import sys
import time
import requests
from typing import List
from bs4 import BeautifulSoup


# 获得当前页面所有图片 url
def get_page_url(page: str) -> List[str]:
    '''
    :description: 获得当前页面所有图片 url
    :param {str} page 指定页号
    :return {List[str]} 返回当前页面的图片 url 列表
    '''
    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',
        'Connection': 'keep-alive'
    }
    url = 'https://wallhaven.cc/toplist?page=' + str(page)
    r = requests.get(url, headers=headers, timeout=5)
    soup = BeautifulSoup(r.text, 'lxml')
    page_url = []
    for link in soup.find_all('a', class_='preview'):
        page_url.append(link.get('href'))
    return page_url


# 图片下载到本地
def download(path: str, start: int = 1, cnt: int = 5) -> None:
    '''
    :description: 图片下载到本地
    :param {str} path 文件存储路径
    :param {int} start 起始页号,默认为1
    :param {int} cnt 爬取页数,默认为5
    :return {*}
    '''
    print('开始爬取 wallhaven/toplist 图片第' + str(start) + '-' + str(start + cnt - 1) + '页')
    # 建立会话
    session = requests.Session()
    session.encoding = 'utf-8'
    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',
        'Connection': 'keep-alive'
    }

    for page in range(start, start + cnt):
        print('开始下载第' + str(page) + '页图片')
        # 获得当前页上所有图片的 url
        page_url = get_page_url(page)

        for i, pic_url in enumerate(page_url, 1):
            # 检查文件是否存在,避免重复下载
            if os.path.exists(path + pic_url.split('/')[-1] + '.png'):
                print('第' + str(page) + '页, 第' + str(i) + '张图片已存在')
                continue

            try:
                r = session.get(pic_url, headers=headers, timeout=5)
                soup = BeautifulSoup(r.text, 'lxml')
            except:
                print('第' + str(page) + '页, 第' + str(i) + '张图片请求失败')
                continue

            # 解析得到图片原路径以及图片id
            img_tag = soup.find('img', id='wallpaper')
            img_id = img_tag.get('data-wallpaper-id')
            img_raw_url = img_tag.get('src')
            # 存储图片名
            img_name = path + img_id + '.png'

            try:
                data = session.get(img_raw_url, headers=headers, timeout=5)
                with open(img_name, 'wb') as f:
                    f.write(data.content)
                    f.flush()
                print('第' + str(page) + '页, 第' + str(i) + '张图片下载成功')
            except:
                print('第' + str(page) + '页, 第' + str(i) + '张图片下载失败')
            else:
                time.sleep(1)

        print('第' + str(page) + '页图片下载完成')
    print('第' + str(start) + '-' + str(start + cnt - 1) + '页图片下载完成')


if __name__ == '__main__':
    cur_dir = os.path.dirname(sys.argv[0])
    databse_dir = cur_dir + '\\wallhaven_download\\'
    if not os.path.exists(databse_dir):
        os.makedirs(databse_dir)
    download(databse_dir)

结语

对于其他的图片网站,我们也可以采取类似的方法下载图片,当然也可能遇到各种各样的问题,比如图片大小,网站验证等问题,这时候就要具体情况具体分析了吧。