整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

告别编程:3款自动化爬虫工具让数据采集变得简单

告别编程:3款自动化爬虫工具让数据采集变得简单

据采集是信息时代的关键,而网络爬虫正是一种高效的技术手段,允许用户在合法框架内从网页和应用程序中提取所需的公开信息。网络爬虫的应用范围极为广泛,包括搜索引擎的数据收集、价格监控、市场研究等。


与屏幕抓取不同,网络爬虫提取的是网页的HTML代码和数据库中的数据,而不仅仅是屏幕上显示的像素。通常,我们使用抓包工具来获取HTML,然后利用解析工具来提取数据。



尽管Python是编写爬虫的传统选择,但自动化工具的出现让数据采集变得更加亲民。接下来,我将向您展示三款高效的自动化爬虫工具:Bazhuayu、Bright Data、Web Scraper。


bazhuayu爬虫

https://affiliate.bazhuayu.com/hEvPKU


bazhuayu,这款桌面端爬虫软件以其强大的功能和易用性著称,即便是编程新手也能通过其可视化界面快速掌握数据采集。它支持多种数据类型采集,包括文本、图片、表格等,并提供自定义功能来满足用户的特定需求。



主要优势包括:

  • 可视化操作:拖拽式界面,无需编码知识。
  • 数据类型丰富:支持文本、图片、表格及HTML采集。
  • 自定义功能强大:用户可设定采集规则和数据处理逻辑。
  • 数据导出便捷:支持CSV、Excel、JSON等多种格式。


使用方法简单直观:

  1. 下载并安装Bazhuayu软件。
  2. 打开目标网页并选择数据区域。
  3. 在软件中设置采集规则。
  4. 点击开始采集,轻松获取数据。


Bright Data爬虫

https://get.brightdata.com/weijun


Bright Data平台提供了一系列强大的数据采集工具,包括Web Scraper IDE、Bright Data Browser、SERP API等,这些工具能够实现自动化数据抓取,无需用户深入理解目标网站的技术细节。



Bright Data的主要优势包括:

  • 平台化操作:直接在Web界面上管理爬虫任务。
  • 数据源广泛:支持网页、API、数据库等多种源。
  • 模板化服务:提供多样的爬虫模板,快速启动任务。


使用Bright Data的步骤包括:

  1. 注册并登录Bright Data账号。
  2. 创建爬虫任务并选择数据源。
  3. 选择模板或编写采集规则。
  4. 设置任务参数并启动任务。


Web Scraper


Web Scraper作为一个轻量级的浏览器扩展,使用户能够在不安装任何额外软件的情况下,在Chrome浏览器中直接进行数据采集。它支持多种数据格式导出,操作简便。



主要优势包括:

  • 易于使用:浏览器扩展,无需额外软件。
  • 操作简便:点击选择数据,无需编码。
  • 支持多种数据格式:CSV、JSON、XML等。


使用Web Scraper的步骤:

  1. 安装扩展插件至Chrome。
  2. 打开目标网页并启动采集。
  3. 选择并采集所需数据。
  4. 导出数据至所需格式。


无论是需要快速简单的数据采集,还是复杂的定制化服务,Bazhuayu、Bright Data、Web Scraper都能满足您的采集需求。选对工具,让数据采集任务变得轻而易举,同时确保合规性和效率。

在前面

  • 代码功能如题:根据快手用户的id来爬取用户所有公开作品,包括图集和视频。
  • 原理:其实就是利用基于chromium内核的浏览器自带的devtools对所有请求进行排查找出包含作品链接的请求,然后用代码模拟请求去获得数据,再根据url下载作品保存就行了,包括一些网站的自动注册登录、操作都可以模拟。这个其实应该算是写过爬虫的同学们都知道。

核心代码

  • 废话不多说,上核心代码
def __crawl_user(self, uid):
if uid.isdigit():
    uid=self.__switch_id(uid)

payload={"operationName": "privateFeedsQuery",
           "variables": {"principalId": uid, "pcursor": "", "count": 999},
           "query": "query privateFeedsQuery($principalId: String, $pcursor: String, $count: Int) {\n  privateFeeds(principalId: $principalId, pcursor: $pcursor, count: $count) {\n    pcursor\n    list {\n      id\n      thumbnailUrl\n      poster\n      workType\n      type\n      useVideoPlayer\n      imgUrls\n      imgSizes\n      magicFace\n      musicName\n      caption\n      location\n      liked\n      onlyFollowerCanComment\n      relativeHeight\n      timestamp\n      width\n      height\n      counts {\n        displayView\n        displayLike\n        displayComment\n        __typename\n      }\n      user {\n        id\n        eid\n        name\n        avatar\n        __typename\n      }\n      expTag\n      __typename\n    }\n    __typename\n  }\n}\n"}
res=requests.post(self.__data_url, headers=self.__headers, json=payload)

works=json.loads(res.content.decode(encoding='utf-8', errors='strict'))['data']['privateFeeds']['list']

if not os.path.exists("../data"):
    os.makedirs("../data")

# 这两行代码将response写入json供分析
# with open("data/" + uid + ".json", "w") as fp:
#     fp.write(json.dumps(works, indent=2))

# 防止该用户在直播,第一个作品默认为直播,导致获取信息为NoneType
if works[0]['id'] is None:
    works.pop(0)
name=re.sub(r'[\\/:*?"<>|\r\n]+', "", works[0]['user']['name'])

dir="data/" + name + "(" + uid + ")/"
# print(len(works))
if not os.path.exists(dir):
    os.makedirs(dir)

# if not os.path.exists(dir + ".list"):
#     print("")

print("开始爬取用户 " + name + ",保存在目录 " + dir)
print(" 共有" + str(len(works)) + "个作品")

for j in range(len(works)):
    self.__crawl_work(uid, dir, works[j], j + 1)
    time.sleep(1)

print("用户 " + name + "爬取完成!")
print()
time.sleep(1)

快手分为五种类型的作品,在作品里面表现为workType属性

  • 其中两种图集: vertical和multiple,意味着拼接长图和多图,所有图片的链接在imgUrls里
  • 一种单张图片: single 图片链接也在imgUrls里
  • K歌: ksong 图片链接一样,不考虑爬取音频...
  • 视频: video 需要解析html获得视频链接



def __crawl_work(self, uid, dir, work, wdx):
    w_type=work['workType']
    w_caption=re.sub(r"\s+", " ", work['caption'])
    w_name=re.sub(r'[\/:*?"<>|\r\n]+', "", w_caption)[0:24]
    w_time=time.strftime('%Y-%m-%d', time.localtime(work['timestamp'] / 1000))

if w_type=='vertical' or w_type=='multiple' or w_type=="single" or w_type=='ksong':
    w_urls=work['imgUrls']
    l=len(w_urls)
    print("  " + str(wdx) + ")图集作品:" + w_caption + "," + "共有" + str(l) + "张图片")
    for i in range(l):
        p_name=w_time + "_" + w_name + "_" + str(i + 1) + ".jpg"
        pic=dir + p_name
        if not os.path.exists(pic):
            r=requests.get(w_urls[i])
            r.raise_for_status()
            with open(pic, "wb") as f:
                f.write(r.content)
            print("    " + str(i + 1) + "/" + str(l) + " 图片 " + p_name + " 下载成功 √")
        else:
            print("    " + str(i + 1) + "/" + str(l) + " 图片 " + p_name + " 已存在 √")
elif w_type=='video':
    w_url=self.__work_url + work['id']
    res=requests.get(w_url, headers=self.__headers_mobile,
                       params={"fid": 1841409882, "cc": "share_copylink", "shareId": "143108986354"})
    html=res.text
    waitreplace=work['id'] + '".*?"srcNoMark":"(.*?)"'

    v_url=re.findall(waitreplace, html)
    # pattern=re.compile(r"playUrl", re.MULTILINE | re.DOTALL)
    # script=soup.find("script", text=pattern)
    # s=pattern.search(script.text).string
    # v_url=s.split('playUrl":"')[1].split('.mp4')[0].encode('utf-8').decode('unicode-escape') + '.mp4'
    try:
        print("  " + str(wdx) + ")视频作品:" + w_caption)
    except:
        print("  这里似乎有点小错误,已跳过")
    v_name=w_time + "_" + w_name + ".mp4"
    video=dir + v_name

    if v_url:
        if not os.path.exists(video):
            r=requests.get(v_url[0])
            r.raise_for_status()

            with open(video, "wb") as f:
                f.write(r.content)
            print("    视频 " + v_name + " 下载成功 √")
        else:
            print("    视频 " + v_name + " 已存在 √")
    else:
        print("未找到视频")
else:
    print("错误的类型")
  • payload就是post参数,这个是在devtools的request请求底下可以找到的
  • 其实就是解析json,然后里面有图片的url和视频的id,我注释掉的两行代码可以保存完整的json的,你可以去掉注释然后看分析保存的json
  • 剩下的看源码吧,不难理解的


  • 注意事项:

    • 不考虑提供列表可选的批量下载功能
    • 有需要的合理功能可以issue反馈,看到后会考虑是否修改
    • 如果需要自定义自己的需求,可以拿走代码自行修改,喜欢的话给个star给个follow
    • 本代码仅供学习使用,不可违反法律爬取视频,以及私自盗用搬运视频,后果自负

    项目源码地址 https://github.com/oGsLP/kuaishou-crawler

    .了解HTML结构:

    在进行网页文章采集之前,首先要熟悉目标网页的HTML结构。通过查看源代码或使用开发者工具,你可以了解到网页中各个元素的标签、类名和ID等信息,为后续的采集工作打下基础。

    2.使用XPath定位元素:

    XPath是一种用于在XML文档中定位元素的语言,同样适用于HTML文档。通过使用XPath表达式,你可以准确地找到目标元素,并提取所需内容。PHP提供了XPath相关函数,如xpath_eval()和xpath_query(),可帮助你轻松实现这一功能。

    3.处理动态加载内容:

    有些网页会使用JavaScript或AJAX等技术动态加载内容,这对采集工作带来了一定的挑战。幸运的是,PHP提供了强大的库和工具,如Selenium和PhantomJS,可以模拟浏览器行为,帮助你获取完整的页面内容。

    4.处理登录和验证码:

    在一些需要登录或输入验证码的网站上进行采集时,需要额外处理这些问题。PHP提供了各种HTTP请求库和验证码识别工具,如cURL和Tesseract OCR,可以帮助你自动处理这些操作,实现无人值守的采集过程。

    5.设置合理的请求头:

    为了避免被目标网站识别为爬虫并限制访问,你需要设置合理的请求头。PHP中可以通过设置HTTP请求头字段来模拟真实的浏览器请求,如User-Agent、Referer和Cookie等。合理设置这些字段可以提高采集成功率。

    6.处理编码和字符集:

    不同网页使用不同的编码和字符集,因此在采集过程中需要正确处理这些问题。PHP提供了mbstring扩展和iconv函数等工具,可以帮助你进行编码转换和字符集处理,确保采集到的内容正确无误。

    7.遵守法律和道德规范:

    在进行网页文章采集时,务必遵守相关法律法规和道德规范。不得未经授权采集他人网站的内容,也不得滥用采集技术损害他人利益。合法、合规地进行网页文章采集,才能为自己和他人带来真正的价值。

    8.注意隐私和安全:

    在进行网页文章采集时,应注意保护用户隐私和数据安全。不得采集带有个人敏感信息的网页内容,也不得将采集到的数据用于非法用途。同时,采集过程中要注意防范网络安全风险,确保自己的操作环境安全可靠。

    9.学习与分享:

    网页文章采集是一个不断学习和探索的过程。通过学习新的技术和经验,你可以不断提升自己的采集能力,并将所学与他人分享。只有共同进步,才能推动整个行业的发展。

    在这篇文章中,我们介绍了网页文章采集中一些重要的PHP技巧。希望这些技巧能够帮助到正在进行网页文章采集的你,让你在采集过程中事半功倍。记住,在使用这些技巧时要遵守法律和道德规范,保护隐私和数据安全。愿你的网页文章采集之路越走越宽广!