最近遇到一个客户,需要在天眼查的高级搜索功能上对关键内容和不同城市搜索的功能进行数据采集,最后结果进行excel导出,由于高级功能需要vip账号,跟客户要到账号密码后进行登录,来到高级搜索页面,如下所示
点击查看结果,如图所示我们抓包下这个请求,按f12,随便复制该页面的内容进行搜索,如图所示结果该请求是一个post请求,经过测试,主要变动的参数是customAreaCodeSet,这个参数是根据你不同的城市代码来确定的,客户需求刚好是根据不同城市来进行数据采集,因此我们只需要改变customAreaCodeSet这个参数就行,我们用代码来模拟这个请求测试,如下所示
import requests
from lxml import etree
import re,time,random
import pandas as pd
title_lis,name_lis,money_lis,date_lis,phone_lis,place_lis = [],[],[],[],[],[]
url = 'https://www.tianyancha.com/advance/search/result?eventPrefix=pc_homeicon'
headers = {
'Cookie': 'HWWAFSESID=3597e7934963bc22147; HWWAFSESTIME=1681647618820; csrfToken=Q3JVIQun7wGL_nXrB8Gpp8Wc; jsid=SEO-BAIDU-ALL-SY-000001; TYCID=0fdc2220dc5111edb9fbe9d5d5385b48; sajssdk_2015_cross_new_user=1; bdHomeCount=0; Hm_lvt_e92c8d65d92d534b0fc290df538b4758=1681647623; bannerFlag=true; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%226589903%22%2C%22first_id%22%3A%221878a025bbe0-02c8062e36a-31614c0c-1821369-1878a025bbf10c9%22%7D; tyc-user-info=%7B%22state%22%3A%225%22%2C%22vipManager%22%3A%220%22%2C%22mobile%22%3A%2213917562998%22%2C%22isExpired%22%3A%220%22%7D; tyc-user-info-save-time=1681647671851; auth_token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMzkxNzU2Mjk5OCIsImlhdCI6MTY4MTY0NzY3MiwiZXhwIjoxNjg0MjM5NjcyfQ.9uv3kgSftWsmwxZVuFfpAOtBtDXzhAVuw8VjVHqW197iA3usv7Eu0HtHWwdm9pmap08bfLlUEpkP2dSdeMntBw; ssuid=8413352730; Hm_lpvt_e92c8d65d92d534b0fc290df538b4758=1681647690; _ga=GA1.2.1330283759.1681647690; _gid=GA1.2.1805192784.1681647690',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
}
# if code:
for pg in range(1,251):
try:
data = {
'xyz': 'Q3JVIQun7wGL_nXrB8Gpp8Wc',
'keywords': '美容',
'regStatusSetNew': '存续、在业',
'companyTypeSet': '个体工商户',
'contactType': '3',
'emptyPhoneFilter': '1',
'customAreaCodeSet': '00{}V2020'.format(110000),
'pageNum': '{}'.format(pg),
'pageSize': '20',
}
r = requests.post(url,headers=headers,data=data)
html = etree.HTML(r.text)
title = html.xpath('//div[@class="info"]/text()')
name = html.xpath('//a[@class="legalPersonName link-click"]/text()')
money = html.xpath('//div[@class="title -narrow text-ellipsis"]/span/text()')
date = html.xpath('//div[@class="title text-ellipsis"]/span/text()')
phone = html.xpath('//div[@class="contact row "]/div/span[2]/text()')
place = re.findall('<div class="contact row">地址:(.*?)</div>',r.text)
print(title)
print(name)
print(money)
print(date)
print(phone)
print(place)
print('*'*100)
title_lis.append(title)
name_lis.append(name)
money_lis.append(money)
date_lis.append(date)
phone_lis.append(phone)
place_lis.append(place)
time.sleep(random.randint(1,4))
except:
break
df = pd.DataFrame({
'店名':title_lis,
'经营者':name_lis,
'资金数额':money_lis,
'成立日期':date_lis,
'电话':phone_lis,
'地址':place_lis,
})
df.to_csv('200_tyc,csv',index=False,encoding='utf_8_sig')
运行代码结果如下所示
注意cookies是自己账号登录的信息,客户要求更具他输入的城市进行采集,经过多次测试发现城市参数前2个00固定的,后面V2020也是固定的,我们只需要弄到中间的就行,经过了解发现,中间的正是中国地级市城市划分代码,根据网上博主的公布的划分代码https://blog.csdn.net/CrazyApes/article/details/128957238,我们就可以来弄成一个字典形式了,完整代码如下所示
import requests
from lxml import etree
import re,time,random
import pandas as pd
txt = """
110000 北京市
120000 天津市
130000 河北省
130100 石家庄市
130200 唐山市
130300 秦皇岛市
130400 邯郸市
130500 邢台市
130600 保定市
130700 张家口市
130800 承德市
130900 沧州市
131000 廊坊市
131100 衡水市
140100 太原市
140200 大同市
140300 阳泉市
140400 长治市
140500 晋城市
140600 朔州市
140700 晋中市
140800 运城市
140900 忻州市
141000 临汾市
141100 吕梁市
150100 呼和浩特市
150200 包头市
150300 乌海市
150400 赤峰市
150500 通辽市
150600 鄂尔多斯市
150700 呼伦贝尔市
150800 巴彦淖尔市
150900 乌兰察布市
152200 兴安盟
152500 锡林郭勒盟
152900 阿拉善盟
210100 沈阳市
210200 大连市
210300 鞍山市
210400 抚顺市
210500 本溪市
210600 丹东市
210700 锦州市
210800 营口市
210900 阜新市
211000 辽阳市
211100 盘锦市
211200 铁岭市
211300 朝阳市
211400 葫芦岛市
220100 长春市
220200 吉林市
220300 四平市
220400 辽源市
220500 通化市
220600 白山市
220700 松原市
220800 白城市
222400 延边朝鲜族自治州
230100 哈尔滨市
230200 齐齐哈尔市
230300 鸡西市
230400 鹤岗市
230500 双鸭山市
230600 大庆市
230700 伊春市
230800 佳木斯市
230900 七台河市
231000 牡丹江市
231100 黑河市
231200 绥化市
232700 大兴安岭地区
310000 上海市
320100 南京市
320200 无锡市
320300 徐州市
320400 常州市
320500 苏州市
320600 南通市
320700 连云港市
320800 淮安市
320900 盐城市
321000 扬州市
321100 镇江市
321200 泰州市
321300 宿迁市
330100 杭州市
330200 宁波市
330300 温州市
330400 嘉兴市
330500 湖州市
330600 绍兴市
330700 金华市
330800 衢州市
330900 舟山市
331000 台州市
331100 丽水市
340100 合肥市
340200 芜湖市
340300 蚌埠市
340400 淮南市
340500 马鞍山市
340600 淮北市
340700 铜陵市
340800 安庆市
341000 黄山市
341100 滁州市
341200 阜阳市
341300 宿州市
341500 六安市
341600 亳州市
341700 池州市
341800 宣城市
350100 福州市
350200 厦门市
350300 莆田市
350400 三明市
350500 泉州市
350600 漳州市
350700 南平市
350800 龙岩市
350900 宁德市
360100 南昌市
360200 景德镇市
360300 萍乡市
360400 九江市
360500 新余市
360600 鹰潭市
360700 赣州市
360800 吉安市
360900 宜春市
361000 抚州市
361100 上饶市
370100 济南市
370200 青岛市
370300 淄博市
370400 枣庄市
370500 东营市
370600 烟台市
370700 潍坊市
370800 济宁市
370900 泰安市
371000 威海市
371100 日照市
371300 临沂市
371400 德州市
371500 聊城市
371600 滨州市
371700 菏泽市
410100 郑州市
410200 开封市
410300 洛阳市
410400 平顶山市
410500 安阳市
410600 鹤壁市
410700 新乡市
410800 焦作市
410900 濮阳市
411000 许昌市
411100 漯河市
411200 三门峡市
411300 南阳市
411400 商丘市
411500 信阳市
411600 周口市
411700 驻马店市
420100 武汉市
420200 黄石市
420300 十堰市
420500 宜昌市
420600 襄阳市
420700 鄂州市
420800 荆门市
420900 孝感市
421000 荆州市
421100 黄冈市
421200 咸宁市
421300 随州市
422800 恩施土家族苗族自治州
430100 长沙市
430200 株洲市
430300 湘潭市
430400 衡阳市
430500 邵阳市
430600 岳阳市
430700 常德市
430800 张家界市
430900 益阳市
431000 郴州市
431100 永州市
431200 怀化市
431300 娄底市
433100 湘西土家族苗族自治州
440100 广州市
440200 韶关市
440300 深圳市
440400 珠海市
440500 汕头市
440600 佛山市
440700 江门市
440800 湛江市
440900 茂名市
441200 肇庆市
441300 惠州市
441400 梅州市
441500 汕尾市
441600 河源市
441700 阳江市
441800 清远市
441900 东莞市
442000 中山市
445100 潮州市
445200 揭阳市
445300 云浮市
450100 南宁市
450200 柳州市
450300 桂林市
450400 梧州市
450500 北海市
450600 防城港市
450700 钦州市
450800 贵港市
450900 玉林市
451000 百色市
451100 贺州市
451200 河池市
451300 来宾市
451400 崇左市
460100 海口市
460200 三亚市
460300 三沙市
460400 儋州市
500000 重庆市
510100 成都市
510300 自贡市
510400 攀枝花市
510500 泸州市
510600 德阳市
510700 绵阳市
510800 广元市
510900 遂宁市
511000 内江市
511100 乐山市
511300 南充市
511400 眉山市
511500 宜宾市
511600 广安市
511700 达州市
511800 雅安市
511900 巴中市
512000 资阳市
513200 阿坝藏族羌族自治州
513300 甘孜藏族自治州
513400 凉山彝族自治州
520100 贵阳市
520200 六盘水市
520300 遵义市
520400 安顺市
520500 毕节市
520600 铜仁市
522300 黔西南布依族苗族自治州
522600 黔东南苗族侗族自治州
522700 黔南布依族苗族自治州
530100 昆明市
530300 曲靖市
530400 玉溪市
530500 保山市
530600 昭通市
530700 丽江市
530800 普洱市
530900 临沧市
532300 楚雄彝族自治州
532500 红河哈尼族彝族自治州
532600 文山壮族苗族自治州
532800 西双版纳傣族自治州
532900 大理白族自治州
533100 德宏傣族景颇族自治州
533300 怒江傈僳族自治州
533400 迪庆藏族自治州
540100 拉萨市
540200 日喀则市
540300 昌都市
540400 林芝市
540500 山南市
540600 那曲市
542500 阿里地区
610100 西安市
610200 铜川市
610300 宝鸡市
610400 咸阳市
610500 渭南市
610600 延安市
610700 汉中市
610800 榆林市
610900 安康市
611000 商洛市
620100 兰州市
620200 嘉峪关市
620300 金昌市
620400 白银市
620500 天水市
620600 武威市
620700 张掖市
620800 平凉市
620900 酒泉市
621000 庆阳市
621100 定西市
621200 陇南市
622900 临夏回族自治州
623000 甘南藏族自治州
630100 西宁市
630200 海东市
632200 海北藏族自治州
632300 黄南藏族自治州
632500 海南藏族自治州
632600 果洛藏族自治州
632700 玉树藏族自治州
632800 海西蒙古族藏族自治州
640100 银川市
640200 石嘴山市
640300 吴忠市
640400 固原市
640500 中卫市
650100 乌鲁木齐市
650200 克拉玛依市
650400 吐鲁番市
650500 哈密市
652300 昌吉回族自治州
652700 博尔塔拉蒙古自治州
652800 巴音郭楞蒙古自治州
652900 阿克苏地区
653000 克孜勒苏柯尔克孜自治州
653100 喀什地区
653200 和田地区
654000 伊犁哈萨克自治州
654200 塔城地区
654300 阿勒泰地区
"""
zd = {}
results = [ii.lstrip().rstrip() for ii in txt.split('\n') if ii.lstrip().rstrip()]
for jj in results:
temp = jj.split(' ')
code,city = temp[0],temp[1]
zd[city] = code
city = input("输入城市:(例如北京市)")
code = zd.get(city)
title_lis,name_lis,money_lis,date_lis,phone_lis,place_lis = [],[],[],[],[],[]
url = 'https://www.tianyancha.com/advance/search/result?eventPrefix=pc_homeicon'
headers = {
'Cookie': 'HWWAFSESItinct_id%22%3A%226589903%22%2C%22first_id%22%3A%221878a025bbe0-02f660c8062e36a-31614c0c-1821369-1878an_id%22%2C%22value%22%3A%226589903%22%7D%2C%22%24device_id%22%3A%221878a025bbe0-02f660c8062e36a-31614c0c-1821369-1878a025bbf10c9%22%7D; tyc-user-info=%7B%22state%22%3A%225%22%2C%22vipManager%22%3A%220%22%2C%22mobile%22%3A%2213917562998%22%2C%22isExpired%22%3A%220%22%7D; tyc-user-info-save-time=1681647671851; auth_token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMzkxNzU2Mjk5OCIsImlhdCI6MTY4MTY0NzY3MiwiZXhwIjoxNjg0MjM5NjcyfQ.9uv3kgSftWsmwxZVuFfpAOtBtDXzhAVuw8VjVHqW197iA3usv7Eu0HtHWwdm9pmap08bfLlUEpkP2dSdeMntBw; ssuid=8413352730; Hm_lpvt_e92c8d65d92d534b0fc290df538b4758=1681647690; _ga=GA1.2.1330283759.1681647690; _gid=GA1.2.1805192784.1681647690',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
}
if code:
for pg in range(1,251):
try:
data = {
'xyz': 'Q3JVIQun7wGL_nXrB8Gpp8Wc',
'keywords': '美容',
'regStatusSetNew': '存续、在业',
'companyTypeSet': '个体工商户',
'contactType': '3',
'emptyPhoneFilter': '1',
'customAreaCodeSet': '00{}V2020'.format(110000),
'pageNum': '{}'.format(pg),
'pageSize': '20',
}
r = requests.post(url,headers=headers,data=data)
html = etree.HTML(r.text)
title = html.xpath('//div[@class="info"]/text()')
name = html.xpath('//a[@class="legalPersonName link-click"]/text()')
money = html.xpath('//div[@class="title -narrow text-ellipsis"]/span/text()')
date = html.xpath('//div[@class="title text-ellipsis"]/span/text()')
phone = html.xpath('//div[@class="contact row "]/div/span[2]/text()')
place = re.findall('<div class="contact row">地址:(.*?)</div>',r.text)
print(title)
print(name)
print(money)
print(date)
print(phone)
print(place)
print('*'*100)
for ii,jj,kk,ll,mm,nn in zip(title,name,money,date,phone,place):
title_lis.append(ii)
name_lis.append(jj)
money_lis.append(kk)
date_lis.append(ll)
phone_lis.append(mm)
place_lis.append(nn)
time.sleep(random.randint(1,4))
except:
break
else:
print('城市输入有误')
df = pd.DataFrame({
'店名':title_lis,
'经营者':name_lis,
'资金数额':money_lis,
'成立日期':date_lis,
'电话':phone_lis,
'地址':place_lis,
})
df.to_csv('200_tyc,csv',index=False,encoding='utf_8_sig')
完美实现功能,在此特别感谢CrazyApes博主 !
点击此处登录后即可评论