python协程爬取某网站的老赖数据
import re
import json
import aiohttp
import asyncio
import time
import pymysql
from asyncio.locks import Semaphore
from functools import partial headers = {
'Cookie': 'auth_token=your_token_here',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
} def save_data(cursor, addr_dic, obj):
try:
data = obj.result()['data']
name = data['iname']
addr = addr_dic.get(name, '')
idcard = data['cardnum']
assert re.match('\d{10}[\d*]{4}\d{3}[\dxX]', idcard)
birth = idcard[6:10]
assert birth.isdigit()
birth += '年'
sex = data.get('sex')
if not sex:
n = int(idcard[-2])
sex = '男' if (n % 2) == 1 else '女'
tm = time.localtime(data.get('regdate', 0) / 1000)
createtime = f'{tm.tm_year}-{tm.tm_mon}-{tm.tm_mday}'
cursor.execute("insert into tianyancha(name, birth, sex, idcard, court, createtime, caseno, base, duty, status, detail, addr) values('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % (
name, birth, sex, idcard, data['courtname'], createtime, data['casecode'], data['gistunit'], data['duty'], data['performance'], data['disrupttypename'], addr
))
except Exception as e:
print('插入错误', e.args) async def parse_case_data(sem, session, cid):
# 爬取详情记录
async with sem: # 控制并发量
async with session.get(f"https://shixin.tianyancha.com/shixin/getDishonestinfoDetailWeb.json?bussinessId={cid}") as rsp:
return await rsp.json() async def parse_province(sem, session, cursor, url):
page = 1
while True:
# 翻页爬取
page_url = f'{url}/p{page}'
async with session.get(page_url) as rsp:
try:
txt = await rsp.text()
# 解析出人名对应的地址
addr_dic = {}
pps = [i.strip() for i in re.findall('dishonest_base_info_detail">(.*?)</', txt, re.S)]
for itm in pps:
try:
name, _, _, addr = itm.split(',')
assert addr.endswith('人。')
addr = addr.rstrip('人。')
addr_dic[name] = addr
except:
pass # 解析出每条失信记录的id
cid_lis = re.findall('data-id="([\da-z]{32})"', txt)
tasks = []
for cid in cid_lis:
# 开启协程爬取解析每条记录
task = asyncio.create_task(parse_case_data(sem, session, cid))
# 回调存入mysql
task.add_done_callback(partial(save_data, cursor, addr_dic))
tasks.append(task)
await asyncio.wait(tasks)
print(f'第{page}页爬取完成')
if 'tic-icon-arrow-right' not in txt:
break
page += 1
except:
print(f'爬取到第{page}页失败')
break async def main():
province = "广东"
url_data = json.load(open('url.json', 'r', encoding='utf-8')) # url.json: 存储省份对应的url的json文件
url_lis = [url_data.get(province)] # 此处是支持全国所有省份一起爬取的,但是我只爬取广东的
sem = Semaphore(4)
conn = pymysql.connect(host='localhost', port=3306, user='user', password='password', charset='utf8', database='db', autocommit=True)
cursor = conn.cursor()
async with aiohttp.ClientSession(headers=headers) as session:
for url in url_lis:
await parse_province(sem, session, cursor, url)
cursor.close()
conn.close() if __name__ == '__main__':
asyncio.run(main())
python协程爬取某网站的老赖数据的更多相关文章
- Python协程爬取妹子图(内有福利,你懂得~)
项目说明: 1.项目介绍 本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...
- python之简单爬取一个网站信息
requests库是一个简介且简单的处理HTTP请求的第三方库 get()是获取网页最常用的方式,其基本使用方式如下 使用requests库获取HTML页面并将其转换成字符串后,需要进一步解析HTML ...
- 初次尝试python爬虫,爬取小说网站的小说。
本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...
- 04 Python网络爬虫 <<爬取get/post请求的页面数据>>之requests模块
一. urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib ...
- python爬虫学习-爬取某个网站上的所有图片
最近简单地看了下python爬虫的视频.便自己尝试写了下爬虫操作,计划的是把某一个网站上的美女图全给爬下来,不过经过计算,查不多有好几百G的样子,还是算了.就首先下载一点点先看看. 本次爬虫使用的是p ...
- Python爬虫:爬取某网站关键词对应商品ID,且存入DB2数据库
公司研发不给力,我就自己写了一个,专门爬关键词对应的商品ID. 其中还学会了用Python操作DB2数据库.Python发送邮件.写日志文件.处理浏览器访问限制. #!/usr/bin/python# ...
- 用python实现多线程爬取影视网站全部视频方法【笔记】
我拿这个站点作为案例:https://91mjw.com/ 其他站点方法都是差不多的. 第一步:获得整站所有的视频连接 html = requests.get("https://91mjw ...
- 046.Python协程
协程 1 生成器 初始化生成器函数 返回生成器对象,简称生成器 def gen(): for i in range(10): #yield 返回便能够保留状态 yield i mygen = gen( ...
- python爬虫--爬取某网站电影信息并写入mysql数据库
书接上文,前文最后提到将爬取的电影信息写入数据库,以方便查看,今天就具体实现. 首先还是上代码: # -*- coding:utf-8 -*- import requests import re im ...
随机推荐
- idea导入配置SSM项目,并进行打包
idea确实是一个功能强大的开发工具,但是配置项目太复杂,每次都要花费很长的时间在配置上. 关于SSM项目导入,配置,打包,看这篇就够了,百试不爽.
- [日常摸鱼]poj2420 A Star not a Tree?
题意:给定$n$个点,找一个点使得这个点到所有点的距离之和最小,求出这个最小距离 传说中的模拟退火- #include<cstdio> #include<ctime> #inc ...
- CTF练习 ①
最近学校要打比赛,,,把我这个混子也给算上了,,不得不赶紧学习学习. 今天学习的是SQL注入的一道题,参考的文章是 https://blog.csdn.net/qq_42939527/article ...
- 闭关修炼180天--手写持久层框架(mybatis简易版)
闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...
- JS拼接字符串太长希望换行保持html格式拼接的方法
1. 通常情况 tabPeoStr +='<tr class="tabPeo"><td>'+data[i].name+'</td><td& ...
- 利用MD5进行加密
package com.cn.peitest; import java.io.UnsupportedEncodingException; import java.security.MessageDig ...
- 发送微信通知 java
//实现类@Service public class WeChatServiceImpl implements IWeChatService { @Override public WeChatSend ...
- python谷歌序列化传输
今日破解某app加密app当中用到了谷歌序列化传输 1.请求序列化文件 # Generated by the protocol buffer compiler. DO NOT EDIT! # sour ...
- JDBC访问数据库的基本步骤是什么?
1.加载(注册)数据库驱动(到JVM) 2.建立(获取)数据库连接. 3.创建(获取)数据库操作对象. 4.定义操作的SQL语句. 5.执行数据库操作. 6.获取并操作结果集. 7.关闭对象,回收数据 ...
- vue3系列:vue3.0自定义全局弹层V3Layer|vue3.x pc桌面端弹窗组件
基于Vue3.0开发PC桌面端自定义对话框组件V3Layer. 前两天有分享一个vue3.0移动端弹出层组件,今天分享的是最新开发的vue3.0版pc端弹窗组件. V3Layer 一款使用vue3.0 ...