02 python爬虫-bs4

发布时间 2023-05-31 15:35:27作者: HaimaBlog

步骤

  1. 爬取主页面中的文章详情的url和图片地址
  2. 下载图片 并请求加文章详情中的页面内容
  3. 爬取文章详情中的标题、作者、发布时间

代码

import requests
import csv
from bs4 import BeautifulSoup

# 请求的一级页面的地址
q_url = 'http://xinfadi.com.cn/newsCenter.html?current=1'

def get_page():
    headers = {
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 UOS'
    }
    r = requests.get(q_url, headers=headers)
    r.encoding = 'utf-8'
    res = r.text

    return res


def parser_text(content):
    # 把页面源代码交给BeautifulSoup进行处理,生成bs对象
    # 从bs对象中查找数据
    # find(标签,属性=值)
    # find_all(标签,属性=值)
    # return
    soup = BeautifulSoup(content, 'html.parser')
    # 找属性id=nowplaying的div 下的 class=list-item 的所有li  find找一个 find_all找所有
    # li_list = soup.find_all('ul', class_='list_con fl')
    # attrs 和 class_ 是一个意思,此时可以避免class关键字
    li_list = soup.find_all('ul', attrs={'class': 'list_con fl'})
    data_list = list()
    for li in li_list:
        dataKV = {}
        src = li.find('a')  # 找li标签下的a标签
        # http://xinfadi.com.cn + /news-118.html
        dataKV['src'] = q_url.split('/newsCenter')[0] + src.get('href')  # 获取href的值

        # http://newlands-n.oss-cn-beijing.aliyuncs.com/IMAGE/bf1d68af-8966-4e1e-bcac-3a34233a6970.jpg
        img = li.find('img')  # 找li标签下的img标签
        dataKV['img'] = img.get('src')  # 获取src的值

        # 下载图片
        save_data_b(dataKV['img'])

        # 请求详情页面
        # http://xinfadi.com.cn/news-137.html
        r = requests.get(dataKV['src'])
        r.encoding = 'utf-8'
        second_res = r.text
        second_soup = BeautifulSoup(second_res, 'html.parser')
        title = second_soup.find('span', attrs={'class': 'right'}).text
        dataKV['title'] = title
        spans = second_soup.find('div', attrs={'class': 'ssss'}).find_all('span')
        dataKV['author'] = spans[0].text
        dataKV['time'] = spans[1].text

        data_list.append(dataKV)
        # print("======" * 10)
    return data_list


# 存为CSV
def save_data_csv(data_list):
    headers = data_list[0].keys()  # 获取标题

    with open('new.csv', 'w', newline='', encoding='utf-8') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()
        f_csv.writerows(data_list)


# 下载图片 、 mp4 、 zip 都可以这样下载
def save_data_b(url):
    r = requests.get(url)
    img_name = url.split("/")[-1]  # p2892635176.jpg
    with open('img/' + img_name, mode='wb') as f:
        f.write(r.content)


if __name__ == '__main__':
	# 步骤
    # 1. 爬取主页面中的文章详情的url和图片地址
    # 2. 下载图片 并请求加文章详情中的页面内容
    # 3. 爬取文章详情中的标题、作者、发布时间

    # 获取页面源代码
    text = get_page()
    # 解析源代码,获取需要的信息
    data_list = parser_text(text)
    # 存为csv数据
    save_data_csv(data_list)

结果

new.csv

src,img,title,author,time
http://xinfadi.com.cn/news-137.html,http://newlands-n.oss-cn-beijing.aliyuncs.com/IMAGE/bf1d68af-8966-4e1e-bcac-3a34233a6970.jpg,​【重要通知】新发地保供车辆司乘人员报备平台,admin,2022-10-13 17:49:47
http://xinfadi.com.cn/news-126.html,http://newlands-n.oss-cn-beijing.aliyuncs.com/IMAGE/2523ea4a-dc2c-461e-b709-270a56241859.jpg,【隆重招商】新发地全国名特优农产品销售中心全新招商,admin,2022-07-18 18:13:42

图片

image