适合男孩子的python爬虫

编写程序:

获得json文件:

首先请求最开始的页面: https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3

但是我们不能这样直接把页面交给requests库直接干,因为这是一个ajax接口,如果不加入参数,很可能让你输入什么验证码还是拉动验证条什么,反正就是很麻烦,那我们就加入参数,具体措施如下:

 

def get_page(offset):    # offset偏移,因为每个ajax都是加载固定的页面数

                     # 这里是20,在第三点图上可以看得到

    global headers  # 全局变量  我后面还要用

    headers = {

        'cookie': 'tt_webid=6821518909792273933; WEATHER_CITY=%E5%8C%97%E4%BA%AC; SLARDAR_WEB_ID=b4a776dd-f454-43c6-81cd-bd37cb5fd0ec; tt_webid=6821518909792273933; csrftoken=4a2a6afcc9de4484af87a2ff8cba0638; ttcid=8732e6def0484fae975c136222a44f4932; s_v_web_id=verify_k9o5qf2w_T0dyn2r8_X6CE_4egN_9OwH_CCxYltDKYSQj; __tasessionId=oxyt6axwv1588341559186; tt_scid=VF6tWUudJvebIzhQ.fYRgRk.JHpeP88S02weA943O6b6-7o36CstImgKj1M3tT3mab1b',

        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Edg/81.0.416.68',

        'referer': 'https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3',

        'x-requested-with': 'XMLHttpRequest'

    }  # 头信息 加入参数

    params = {

        'aid': ' 24',

        'app_name': ' web_search',

        'offset': offset,

        'format': ' json',

        'keyword': ' 美女',

        'autoload': ' true'

        'count': ' 20

        'en_qc': ' 1',

        'cur_tab': ' 1',

        'from': ' search_tab',

        'pd': ' synthesis',

        'timestamp': int(time.time())

    url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)  # 构造url, 使用到了urlencode() 函数

      } function(){   // 外汇术语 https://www.gendan5.com/terminology.html

    url = url.replace('=+', '=')  # 这里必须注意现在的网址根本不一样

    # print(url)          

    try:

        r = requests.get(url, headers=headers, params=params)

        r.content.decode('utf-8')

        if r.status_code == 200:

            return r.json()  # 返回json格式 因为全是字典类型

    except requests.ConnectionError as e:

        print(e)

这里必须注意一点,请求的网址已经改掉了,我在代码里面给了解释,仔细看看。

 

获得标题和网址:

def get_image(json):  # 获取图片

    if json.get('data'):  # 如果这个存在

        for item in json.get('data'):

            if item.get('title') is None:

                continue  # 如果标题是空值

            title = item.get('title')  # 获取标题

            if item.get('article_url') == None:

                continue

            url_page = item.get('article_url')

            # print(url_page)

            rr = requests.get(url_page, headers=headers)

            if rr.status_code == 200:

                pat = ''  #  用正则大致匹配一下范围

                match = re.search(pat, rr.text, re.S)

                if match != None:

                    result = re.findall(r'img src=\\"(.*?)\\"', match.group(), re.S)

                

                #  print(i.encode('utf-8').decode('unicode_escape')

                    # 转换编码方式 把\u之类的改掉

                    yield {

                        'title': title,

                        'image': result

                    }

这里获取的网页链接都是Unicode格式的,在后面的下载部分,我给了修改方案,这也是一个暗坑。

 

下载图片:

def save_image(content):

    path = 'D://今日头条美女//'  # 目录

    if not os.path.exists(path):  # 创建目录

        os.mkdir(path)

        os.chdir(path)

    else:

        os.chdir(path)

    # ------------------------------------------

 

    if not os.path.exists(content['title']):  # 创建单个文件夹

        if '\t' in content['title']:  # 以title为标题创建单个文件夹

            title = content['title'].replace('\t', '')  # 去除特殊符号 不然创建不了文件名称

            os.mkdir(title + '//')

            os.chdir(title + '//')

            print(title)

        else:

            title = content['title']

            os.mkdir(title + '//')  # 创建文件夹

            os.chdir(title + '//')

            print(title)

    else:  # 如果存在

        if '\t' in content['title']:  # 以title为标题创建单个文件夹

            title = content['title'].replace('\t', '')  # 去除特殊符号 不然创建不了文件名称

            os.chdir(title + '//')

            print(title)

        else:

            title = content['title']

            os.chdir(title + '//')

            print(title)

    for q, u in enumerate(content['image']):  # 遍历图片地址列表

        u = u.encode('utf-8').decode('unicode_escape')

        # 先编码在解码 获得需要的网址链接

        #  开始下载

        r = requests.get(u, headers=headers)

        if r.status_code == 200:

            # file_path = r'{0}/{1}.{2}'.format('美女', q, 'jpg')  # 文件的名字和地址,用三目运算符来调试文件夹的名字

            # hexdisgest() 返回十六进制图片

            with open(str(q) + '.jpg', 'wb') as fw:

                fw.write(r.content)

                print(f'该系列----->下载{q}张')

U变量的时候进行了编码在解码操作,然后网址就正常很多了。


请使用浏览器的分享功能分享到微信等