属课程中代码敲下。
课程地址:http://study.163.com/course/courseLearn.htm?courseId=1003735019#/learn/video?lessonId=1004298385&courseId=1003735019
代码如下:
import requests
import re
from bs4 import BeautifulSoup
from requests.exceptions import RequestException # 处理异常
from urllib.parse import urlencode
import json
def get_page_index(offset,keyword):
data ={
‘offset’: offset ,
‘format’: ‘json’,
‘keyword’:keyword ,
‘autoload’: ‘true’,
‘count’: 20,
‘cur_tab’: 3
}
url ='https://www.toutiao.com/search_content/?'+ urlencode(data)#把字典对象转为url请求参数
try:
response = requests.get(url)
if response.status_code ==200:
return response.text
return None
except RequestException:
print('请求索引页出错')
return None
def parse_page_index(html):
data =json.loads(html )#使用json把字符串的形式转为对象
if data and ‘data’in data.keys(): #加个判断确认json中含有data属性(因为需要爬取的数据在data里,然后遍历data取出其中我们需要的数据(eg:url,返回的是json的所以键名)
for item in data.get(‘data’): #加引号的data表示在json中需要寻找的数据
yield item.get(‘article_url’)# 构造一个生产器
def get_page_detial(url): # 拿到详情页面
try:
response = requests.get(url)
if response.status_code ==200:
return response.text
return None
except RequestException:
print(‘请求详细页出错’,url)
return None
def parse_page_detial(html,url):# 定义一个解析详情页的方法
soup =BeautifulSoup(html,’lxml’)
title =soup.select(‘title’)[0].get_text()
print(title)
image_pattern=re.compile(‘var gallery =(.*?);’,re.S) #正则表达式的使用!!!
result=re.search(image_pattern ,html )#利用search方法导入正则表达式对象,然后再页面上寻找对应字符串
if result:
###print(result.group(1) )#group(1)是定义的第一个括号的内容?(应该是第一个(.*?))
# 拿到的是json字符串,然后提取出url
data =json.loads(result.group(1) )
if data and ‘sub_images’in data.keys(): #判断匹配的json格式的data中是否含有’sub_images’关键字(网页中是可以找到的)
sub_images=data.get(‘sub_images’)#把’sub_image’的字符串提取出来
images=[item.get(‘url’)for item in sub_images ] #以一个列表形式,利用一个for循环遍历得到url!!!实用!!!!
return {
‘title’:title,
‘url’:url,
‘images’:images # 得到的images数组
}
def main():
html =get_page_index(0,’街拍’)
for url in parse_page_index(html ):
html =get_page_detial(url) #调用get_page_detial方法把url传入得到一个个页面!!!实用!
if html: #表示如果html成功返回的话就调用parse_page_detail方法!!!
result=parse_page_detial(html,url)# 把html当作参数传入,url是整个街拍图像的url
print(result )
if name==’main‘:
main()