Home

韧桂

思考,总结

先获取一个页面的网页源代码

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