import requests
from fake_useragent import UserAgent
from requests.exceptions import Timeout
from urllib.parse import quote, unquote
import re, json, os, hashlib
from lxml import etree
import time
from multiprocessing import Process, Queue, Pool # 之前想使用多进程,通过队列处理图片下载。没有实现 userAgent = UserAgent()
headers = {
"User-Agent": userAgent.random,
"Host": "tuchong.com",
"Referer": "https://tuchong.com/explore/"
}
baseUrl = "https://tuchong.com/rest/tag-categories/"
baseTagUrl = "https://tuchong.com/rest/tags/"
tagReferer = "https://tuchong.com/tags/" timeout = 5
s = requests.Session() dic = {
"subject": [],
"style": [],
"equipment": [],
"location": [],
} categoriesDict = {
"subject": "题材",
"style": "风格",
"equipment": "器材",
"location": "地区",
} def getCategoryPage(url, category, page=1):
try:
url = url + category
params = {
"page": page,
"count": 20
}
response = s.get(url=url, headers=headers, timeout=timeout, params=params)
if response.status_code == 200:
response.category = category
return response
except Timeout as e:
print(e)
return None def getTagNameUrl(response):
if not response:
return None
data_dict = response.json()
tag_list = data_dict.get("data").get("tag_list")
tag_name_list = [tag.get("tag_name") for tag in tag_list]
return tag_name_list def getNextPageUrl(response):
if not response:
return []
data_dict = response.json()
pages = int(data_dict.get("data").get("pages"))
for page in range(2, pages + 1):
yield page def getAllTag():
global dic
s.get(url="https://tuchong.com/explore/", headers=headers, timeout=timeout)
for category in categoriesDict.keys():
print("获取 -{}- 第 <{}> 页tagName信息.........".format(categoriesDict.get(category), 1))
response = getCategoryPage(url=baseUrl, category=category)
tag_name_list = getTagNameUrl(response) or []
dic.get(category).extend(tag_name_list)
time.sleep(1)
for page in getNextPageUrl(response):
print("获取 -{}- 第 <{}> 页tagName信息.........".format(categoriesDict.get(category), page))
response = getCategoryPage(url=baseUrl, category=category, page=page)
tag_name_list = getTagNameUrl(response) or []
dic.get(category).extend(tag_name_list)
time.sleep(1) def getTagPage(url, tag, page):
tag = quote(tag)
url = url + tag + "/posts"
params = {
"page": page,
"count": 20,
"order": "weekly"
}
headers["Referer"] = tagReferer + tag + "/"
try:
response = requests.get(url=url, params=params, headers=headers, timeout=timeout)
if response.status_code == 200:
return response
except Timeout as e:
print(e)
return None def getImagesInfo(response):
print('---')
if not response:
return None
result = response.json().get("result")
if result == "INVALID":
print("数据取完了")
return None
postList = response.json().get("postList")
imageUrlList = [dic.get("url") for dic in postList]
titleList = [dic.get("title").strip() for dic in postList]
for img_url_title in zip(titleList, imageUrlList):
img_url_title = list(img_url_title)
yield img_url_title def get_md5(img_url):
m = hashlib.md5()
m.update(bytes(img_url, encoding="utf-8"))
return m.hexdigest() def download(imgsUrl):
if imgsUrl:
for img_url in imgsUrl:
response = requests.get(url=img_url)
name = get_md5(img_url)
print("正在下载{}...".format(img_url))
with open(os.path.join(BASE_PATH, name) + ".jpg", "wb") as f:
f.write(response.content) def gogo(tagname):
page = 1
while True:
response = getTagPage(url=baseTagUrl, tag=tagname, page=page)
print("开始爬取 {} 第 {} 页...".format(tagname, page))
info = getImagesInfo(response) or []
if not response:
return
for info_tuple in info:
imgsUrl = putImageUrl(info_tuple)
download(imgsUrl)
page += 1
time.sleep(5) def putImageUrl(img_url_title_list):
if img_url_title_list:
img_url = img_url_title_list[1]
try:
response = s.get(url=img_url, headers=headers, timeout=timeout)
html = etree.HTML(response.text)
imgsUrl = html.xpath("//article[@class='post-content']/img/@src")
return imgsUrl
except requests.exceptions.ConnectionError as e:
print(e)
return None def downloadImage():
for key in dic:
tagname_list = dic.get(key)
for tagname in tagname_list:
gogo(tagname) def run():
getAllTag()
print("所有tag信息获取完毕.........")
print("开始获取每个tag的内容.........")
downloadImage() if __name__ == '__main__':
BASE_PATH = r"D:\tuchong"
run()

python3爬虫-通过requests爬取图虫网的更多相关文章

  1. 爬取图虫网 示例网址 https://wangxu.tuchong.com/23892889/

    #coding=gbk import requests from fake_useragent import UserAgent from lxml import etree import urlli ...

  2. python3爬虫-使用requests爬取起点小说

    import requests from lxml import etree from urllib import parse import os, time def get_page_html(ur ...

  3. python3爬虫-通过requests爬取西刺代理

    import requests from fake_useragent import UserAgent from lxml import etree from urllib.parse import ...

  4. Python3爬虫使用requests爬取lol英雄皮肤

    本人博客:https://xiaoxiablogs.top 此次爬取lol英雄皮肤一共有两个版本,分别是多线程版本和非多线程版本. 多线程版本 # !/usr/bin/env python # -*- ...

  5. 爬虫 Scrapy框架 爬取图虫图片并下载

    items.py,根据需求确定自己的数据要求 # -*- coding: utf-8 -*- # Define here the models for your scraped items # # S ...

  6. Python爬虫训练:爬取酷燃网视频数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 项目目标 爬取酷燃网视频数据 https://krcom.cn/ 环境 Py ...

  7. python爬虫基础应用----爬取校花网视频

    一.爬虫简单介绍 爬虫是什么? 爬虫是首先使用模拟浏览器访问网站获取数据,然后通过解析过滤获得有价值的信息,最后保存到到自己库中的程序. 爬虫程序包括哪些模块? python中的爬虫程序主要包括,re ...

  8. python3 爬虫教学之爬取链家二手房(最下面源码) //以更新源码

    前言 作为一只小白,刚进入Python爬虫领域,今天尝试一下爬取链家的二手房,之前已经爬取了房天下的了,看看链家有什么不同,马上开始. 一.分析观察爬取网站结构 这里以广州链家二手房为例:http:/ ...

  9. 【Python3爬虫】我爬取了七万条弹幕,看看RNG和SKT打得怎么样

    一.写在前面 直播行业已经火热几年了,几个大平台也有了各自独特的“弹幕文化”,不过现在很多平台直播比赛时的弹幕都基本没法看的,主要是因为网络上的喷子还是挺多的,尤其是在观看比赛的时候,很多弹幕不是喷选 ...

随机推荐

  1. volley4--RequestQueue

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  2. 星空灯改装成USB供电

    简单的手工活,20分钟搞定 1.用一根USB线剪断,将红黑两根线分别连接到星空灯电源供电的正负极 2.由于USB输出5V 0.5A的电流,因此需要改装下,办法一,加电阻,办法二,换灯泡,由于小电阻并不 ...

  3. tomcat优化记录

    1.使用jdk自带的Jconsole进行可视化查看: 2.使用jmeter做压力测试,做完后有几个重要的指标:正确率.cpu占用率.qps jvm: 3.tomcat server.xml优化: ar ...

  4. Angular架构概览(截取部分)

    原文链接:https://angular.cn/docs/ts/latest/guide/architecture.html 我们是这样写 Angular 应用的:用 Angular 扩展语法编写 H ...

  5. jQuery的安装

    一.jQuery的安装 下载 jQuery 有两个版本的 jQuery 可供下载: Production version - 用于实际的网站中,已被精简和压缩. Development version ...

  6. netstat 检测及监测网络连接

    网站没有很多流量,可查带宽却跑了几十M? 这是什么情况呢?      如果是出现这种情况,不排除是被CC了的可能.那么如何确定是否真的被CC了,被CC又有什么对应政策呢? netstat -na ,用 ...

  7. Scala编程实战

    项目概述 需求 目前大多数的分布式架构底层通信都是通过RPC实现的,RPC框架非常多,比如前我们学过的Hadoop项目的RPC通信框架,但是Hadoop在设计之初就是为了运行长达数小时的批量而设计的, ...

  8. 爬虫IP被禁的简单解决方法——切换UserAgent

    [转载]Python爬虫之UserAgent 用到的库 https://github.com/hellysmile/fake-useragent

  9. Exchange Server 2016 管理邮箱收发限制

    备注:本文是Exchange Server 2016管理系列的配套课件,更加详细的讲解请参考视频课程,文章结尾有视频课程主页的链接. 进行收发邮件大小的限制是很有必要的,因为邮件服务器不能当作文件服务 ...

  10. python 反转字符串 [::-1]的问题

    >>> a = '12345' >>> a[:-1]'1234' -1表示最后一个,所以取第一个到最后且不包含最后一个 >>> a[1:4:2]' ...