先获取一个页面的网页源代码
from urllib.parse import urlencode
import requests
from requests.exceptions import RequestException
def get_page_index(offset, keyword): #将可变的参数传入进去
data = {
'aid': '24',
'offset': offset,
'format': 'json',
'keyword': keyword,
'autoload': 'true',
'count': '20',
'cur_tab': '1',
'from': 'search_tab',
'pd': 'synthesis'
}
url = 'https://www.toutiao.com/api/search/content/?' + urlencode(data)
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6823.400 QQBrowser/10.3.3117.400'}
response = requests.get(url, headers=headers)
if response.status_code ==200:
return response.text
return None
except RequestException:
print('请求索引页出错')
return None
def main():
html = get_page_index(0,'街拍')
print(html)
if __name__ == '__main__':
main()
抓取各个文章的url
def parse_page_index(html): #抓取文章的url
data = json.loads(html) #用json.loads 方法将json字符串转换成json格式的变量
#先加一判断,来保证json数据含有data这个属性的。含有data属性后,再将data其遍历,再将其里面的每一条数据量按照url地址提取出来
if data and 'data' in data.keys(): #data.keys返回的是json的所有的键名
for item in data.get('data'): #判断data是在这个键名里,说明是含有data这个信息的
yield item.get('article_url') #再对这个data进行遍历,把每一个item进行循环,把article_url提取出来。通过yield构造一个生成器,就可以把所有的article_url提取出来
def main():
html = get_page_index(0,'街拍')
for url in parse_page_index(html): #调用生成器,提取所有的url,利用for循环输入生成器,把html传入进去
print(url)
解析文章详情页的标题及json字符串(有图片url)
def get_page_detail(url): # 提取详情页的组图信息
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6823.400 QQBrowser/10.3.3117.400'}
response = requests.get(url, headers=headers)
if response.status_code ==200:
return response.text
return None
except RequestException:
print('请求详情页出错',url)
return None
def parse_page_detail(html):#解析详情页内容
soup = BeautifulSoup(html,'lxml')
title = soup.select('title')[0].get_text() #get_text提取文本信息
print(title)
#images_pattern = re.compile('BASE_DATA.galleryInfo = .*?gallery: JSON.parse(.*?),',re.S)
images_pattern = re.compile('gallery: JSON.parse\("(.*?)"\)') #利用转义符保留括号进行匹配
result = re.search(images_pattern,html) #search方法对整个文档传入正则对象,再把字符串传进来。group(1),定义的第一个括号里的内容
if result: #判断匹配是否成功
print(result.group(1))
def main():
html = get_page_index(0,'街拍')
for url in parse_page_index(html): #调用生成器,提取所有的url,利用for循环输入生成器,把html传入进去
#print(url)
html = get_page_detail(url)
if html: #如果成功返回
parse_page_detail(html) #调用解析函数
欢迎关注我的公众号:「韧桂」
韧桂 2019-02-17