02 python爬虫-bs4
步骤
- 爬取主页面中的文章详情的url和图片地址
- 下载图片 并请求加文章详情中的页面内容
- 爬取文章详情中的标题、作者、发布时间
代码
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
图片
[Haima的博客]
http://www.cnblogs.com/haima/