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. 从零开始安装、编译、部署 Docker

    简介 主要介绍如何从基础系统debian部署docker关于docker基础知识在 相关资料 里有链接 安装docker 1.使用root用户身份添加apt源添加public key使docker的安 ...

  2. Ubuntu 安装 PhpMyAdmin 图文教程

    Ubuntu 安装 PhpMyAdmin 管理 MySQL 数据库 PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmi ...

  3. 理解ASP.NET 5运行时命令:DNVM, DNX, 和DNU

    ASP.NET 5 引入了一个新型的运行时,让我们可以现场交付模式组合式构建应用程序,而不依赖于宿主机上的.NET框架.这种新模式为我们提供了命令行工具(DNVM.DNX.DNU)用于管理我们的.ne ...

  4. vue3.0环境最新安装步骤

    安装最新的node.js版本: https://nodejs.org/dist/v8.11.3/node-v8.11.3-x64.msi 安装vue:  npm install -g @vue/cli ...

  5. 企业级Apache详解2

    http_conf主配置说明 root@lamp01 apache]# grep -Ev "#|^$" conf/httpd.conf DocumentRoot "/us ...

  6. Linxu下 expect的安装与使用

    expect学习 1.什么是except        Expect是基于Tcl的一个相对简单的免费脚本文件语言工具,用于实现自动和交互式程序进行通信            is a software ...

  7. Exchange2016 & Skype for business 集成之三统一联系人存储

    Exchange2016&Skype for business集成之二统一联系人存储 利用统一的联系人存储库,用户可以维护单个联系人列表,然后使这些联系人适用于多个应用程序,包括 Skype ...

  8. 8个PHP数组面试题

    1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. 代码如下: <?php function arrsort($first,$length){ $arr = array(); ...

  9. UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS

    引用地址: http://www.cnblogs.com/silenkee/articles/1609831.html   页面中加入了UpdatePanel后,Response.Write(&quo ...

  10. 求最长公共子串 Longest Common Subsequence

    最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...