您的位置:首页 > 其它

爬取今日头条街拍

2017-04-26 09:57 225 查看
属课程中代码敲下。

课程地址: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()

还有入库内容,未完待续。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫