鱼C论坛

 找回密码
 立即注册
查看: 1466|回复: 7

[已解决]简单爬虫问题

[复制链接]
发表于 2021-2-23 13:24:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问怎样爬取天眼查的信息,求思路或者代码和注释也行,求助大佬们,葵丘55!!
最佳答案
2021-2-23 15:31:31
这个不难吧,没爬过,稍微看了一下,网页数据在源代码中(不过未登录状态看不到完整数据)。一步一步请求就行了,先请求搜索页,拿到公司列表信息(每个公司页面的url),再请求公司页url,最后获取公司信息,可以按这个思路去爬。
不过这种网站如果请求太频繁应该都会遇到IP反爬,我稍微写了几句代码测试,暂时没遇到反爬。
import requests
from lxml import etree

url = 'https://www.tianyancha.com/search?key=%E8%85%BE%E8%AE%AF'
# 如果翻页,url就是'https://www.tianyancha.com/search/p' + 页码 + '?key=' + 关键词
headers = {'user-agent': 'Mozilla/5.0'}
res = requests.get(url, headers=headers)   #  请求搜索页
sel = etree.HTML(res.text)
items = sel.xpath('//*[@class="search-item sv-search-company"]')   # 获取公司列表
for item in items:
    name = item.xpath('string(div/div[3]/div[1]/a)')    #  公司名
    url_ = item.xpath('div/div[3]/div[1]/a/@href')[0]   # 公司页url
    res1 = requests.get(url_, headers=headers)   # 请求公司页
    sel1 = etree.HTML(res1.text)
    id_ = sel1.xpath('//*[@id="_container_baseInfo"]/table/tbody/tr[5]/td[2]/text()')[0]  # 统一社会信用代码
    print(id_)
    break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-23 14:07:10 | 显示全部楼层
1、打开天眼查,随便搜索关键词,例如KFC
2、URL变成:https://www.tianyancha.com/search?key=KFC
3、到了这步爬取就没问题了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:44:05 | 显示全部楼层
笨鸟学飞 发表于 2021-2-23 14:07
1、打开天眼查,随便搜索关键词,例如KFC
2、URL变成:https://www.tianyancha.com/search?key=KFC
3、到 ...

这个我发现了的,用input函数就可以,我关键是请求后的页面爬取不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:31:31 | 显示全部楼层    本楼为最佳答案   
这个不难吧,没爬过,稍微看了一下,网页数据在源代码中(不过未登录状态看不到完整数据)。一步一步请求就行了,先请求搜索页,拿到公司列表信息(每个公司页面的url),再请求公司页url,最后获取公司信息,可以按这个思路去爬。
不过这种网站如果请求太频繁应该都会遇到IP反爬,我稍微写了几句代码测试,暂时没遇到反爬。
import requests
from lxml import etree

url = 'https://www.tianyancha.com/search?key=%E8%85%BE%E8%AE%AF'
# 如果翻页,url就是'https://www.tianyancha.com/search/p' + 页码 + '?key=' + 关键词
headers = {'user-agent': 'Mozilla/5.0'}
res = requests.get(url, headers=headers)   #  请求搜索页
sel = etree.HTML(res.text)
items = sel.xpath('//*[@class="search-item sv-search-company"]')   # 获取公司列表
for item in items:
    name = item.xpath('string(div/div[3]/div[1]/a)')    #  公司名
    url_ = item.xpath('div/div[3]/div[1]/a/@href')[0]   # 公司页url
    res1 = requests.get(url_, headers=headers)   # 请求公司页
    sel1 = etree.HTML(res1.text)
    id_ = sel1.xpath('//*[@id="_container_baseInfo"]/table/tbody/tr[5]/td[2]/text()')[0]  # 统一社会信用代码
    print(id_)
    break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 18:01:28 | 显示全部楼层
YunGuo 发表于 2021-2-23 15:31
这个不难吧,没爬过,稍微看了一下,网页数据在源代码中(不过未登录状态看不到完整数据)。一步一步请求就 ...
import requests
from lxml import etree
url='https://www.tianyancha.com/relatedbossorganize?keyBoss=%E8%85%BE%E8%AE%AF'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'}
page_text=requests.get(url=url,headers=headers).text
response=etree.HTML(page_text)
boss_list=response.xpath('//div[@class="boss-list"]')
print(boss_list)
for boss in boss_list:
    boss_name=boss.xpath('./div[2]/div[2]/a/text()')
    company_name=boss.xpath('./div[3]/div[1]/div[2]/a/@title')
    print(boss_name,company_name)





但是我发现有些时候xpath是对的,可是匹配不出来任何东西(上面就是按照就是我写的,请大佬康康)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 18:01:58 | 显示全部楼层
YunGuo 发表于 2021-2-23 15:31
这个不难吧,没爬过,稍微看了一下,网页数据在源代码中(不过未登录状态看不到完整数据)。一步一步请求就 ...

但是我发现有些时候xpath是对的,可是匹配不出来任何东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 19:47:19 | 显示全部楼层
本帖最后由 YunGuo 于 2021-2-23 19:50 编辑
caly_fast 发表于 2021-2-23 18:01
但是我发现有些时候xpath是对的,可是匹配不出来任何东西


就是xpath语法错了,给你修改后,你运行看看。
import requests
from lxml import etree
url='https://www.tianyancha.com/relatedbossorganize?keyBoss=%E8%85%BE%E8%AE%AF'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'}
page_text=requests.get(url=url,headers=headers).text
# print(page_text)
response=etree.HTML(page_text)
boss_list=response.xpath('//*[@class="slider-boss sv-search-company-human"]')   # 就是这一句xpath错了,你后面就拿不到任何数据
# print(boss_list)
for boss in boss_list:
    boss_name=boss.xpath('div[2]/div[2]/a/text()')    # 其实这里和下面的xpath你写的是对的,不过我写代码的习惯是不加'./',结果是一样的
    company_name=boss.xpath('div[3]/div[1]/div[2]/a/@title')
    print(boss_name,company_name)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-23 20:32:49 | 显示全部楼层
YunGuo 发表于 2021-2-23 19:47
就是xpath语法错了,给你修改后,你运行看看。

感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表