网页视频抓取工具 知乎(Python开发爬虫常用的工具总结及网页抓取思路数据是否可以直接从HTML中获取?)

优采云 发布时间: 2021-11-20 23:10

  网页视频抓取工具 知乎(Python开发爬虫常用的工具总结及网页抓取思路数据是否可以直接从HTML中获取?)

  使用Python开发爬虫是一件非常轻松愉快的事情,因为相关的库很多,而且使用起来很方便,十几行代码就可以完成一个爬虫的开发;

  但是在对付网站有防爬措施,网站有js动态加载,App采集,就得动脑筋了;而在分布式爬虫的开发中,高性能爬虫的时候就得精心设计。

  Python开发爬虫reqeusts常用工具汇总:Python HTTP网络请求库;pyquery:Python HTML DOM结构分析库,使用类似JQuery的语法;BeautifulSoup:python HTML 和 XML 结构分析;selenium:Python自动化测试框架,可用于爬虫;Phantomjs:无头浏览器,可以配合selenium获取js动态加载的内容;re: python 内置正则表达式模块;fiddler:抓包工具,原理是一个可以抓手机包的代理服务器;anyproxy:代理服务器,可以自己编写规则来拦截请求或响应,一般用在客户端采集;celery:Python分布式计算框架,可用于开发分布式爬虫;事件:基于协程的python网络库,可用于开发高性能爬虫grequests:asynchronous requestssaio http:异步http客户端/服务器框架asyncio:python内置异步io,事件循环库uvloop:一个非常快的事件循环库, with asyncio 极其高效的并发:Python 内置用于并发任务执行scrapy 的扩展:python 爬虫框架;Splash:一个JavaScript渲染服务,相当于一个轻量级浏览器,带有lua脚本,通过他的http API解析页面;Splinter:开源自动化Python Web 测试工具pyspider:Python 爬虫系统网页 爬取思路数据能否直接从HTML 中获取?数据直接嵌套在页面的HTML结构中;数据是使用JS动态渲染到页面中的吗?数据嵌套在js代码中,然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:然后用js加载到页面或者用ajax渲染;获取的页面使用需要认证吗?登录后可以访问该页面;可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:可以通过API直接获取数据吗?部分数据可以通过API直接获取,省去了解析HTML的麻烦。大多数 API 以 JSON 格式返回数据;来自客户端的数据采集 怎么样?比如:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:微信APP和微信客户端怎么应对反爬的不要太多,控制爬虫的速度,不要把人打倒,你会两败俱伤;使用代理隐藏真实IP,实现防爬;使爬虫看起来像人类用户,可选择设置以下 HTTP 标头:

  检查网站的cookie。在某些情况下,请求需要添加一个cookie来通过服务器上的一些验证;案例讲解静态页面解析(获取微信公众号文章)

  import pyquery

import re

def weixin_article_html_parser(html):

"""

解析微信文章,返回包含文章主体的字典信息

:param html: 文章HTML源代码

:return:

"""

pq = pyquery.PyQuery(html)

article = {

"weixin_id": pq.find("#js_profile_qrcode "

".profile_inner .profile_meta").eq(0).find("span").text().strip(),

"weixin_name": pq.find("#js_profile_qrcode .profile_inner strong").text().strip(),

"account_desc": pq.find("#js_profile_qrcode .profile_inner "

".profile_meta").eq(1).find("span").text().strip(),

"article_title": pq.find("title").text().strip(),

"article_content": pq("#js_content").remove('script').text().replace(r"\r\n", ""),

"is_orig": 1 if pq("#copyright_logo").length > 0 else 0,

"article_source_url": pq("#js_sg_bar .meta_primary").attr('href') if pq(

"#js_sg_bar .meta_primary").length > 0 else '',

}

# 使用正则表达式匹配页面中js脚本中的内容

match = {

"msg_cdn_url": {"regexp": "(? a.W_texta").attr("title"))

return html

except (TimeoutException, Exception) as e:

print(e)

finally:

driver.quit()

if __name__ == '__main__':

weibo_user_search(url="http://s.weibo.com/user/%s" % parse.quote("新闻"))

# 央视新闻

# 新浪新闻

# 新闻

# 新浪新闻客户端

# 中国新闻周刊

# 中国新闻网

# 每日经济新闻

# 澎湃新闻

# 网易新闻客户端

# 凤凰新闻客户端

# 皇马新闻

# 网络新闻联播

# CCTV5体育新闻

# 曼联新闻

# 搜狐新闻客户端

# 巴萨新闻

# 新闻日日睇

# 新垣结衣新闻社

# 看看新闻KNEWS

# 央视新闻评论

  使用Python模拟登录获取cookies

  有的网站比较痛苦,通常需要登录才能获取数据。下面是一个简单的例子:是不是用来登录网站,获取cookie,然后可以用于其他请求

  但是,这里只有在没有验证码的情况下,如果要短信验证、图片验证、邮件验证,就得单独设计;

  目标网站:,日期:2017-07-03,如果网站的结构发生变化,需要修改如下代码;

  #!/usr/bin/env python3

# encoding: utf-8

from time import sleep

from pprint import pprint

from selenium.common.exceptions import TimeoutException, WebDriverException

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

from selenium import webdriver

def login_newrank():

"""登录新榜,获取他的cookie信息"""

desired_capabilities = DesiredCapabilities.CHROME.copy()

desired_capabilities["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "

"AppleWebKit/537.36 (KHTML, like Gecko) "

"Chrome/59.0.3071.104 Safari/537.36")

desired_capabilities["phantomjs.page.settings.loadImages"] = True

# 自定义头部

desired_capabilities["phantomjs.page.customHeaders.Upgrade-Insecure-Requests"] = 1

desired_capabilities["phantomjs.page.customHeaders.Cache-Control"] = "max-age=0"

desired_capabilities["phantomjs.page.customHeaders.Connection"] = "keep-alive"

# 填写自己的账户进行测试

user = {

"mobile": "user",

"password": "password"

}

print("login account: %s" % user["mobile"])

driver = webdriver.PhantomJS(executable_path="/usr/bin/phantomjs",

desired_capabilities=desired_capabilities,

service_log_path="ghostdriver.log", )

# 设置对象的超时时间

driver.implicitly_wait(1)

# 设置页面完全加载的超时时间,包括页面全部渲染,异步同步脚本都执行完成

driver.set_page_load_timeout(60)

# 设置异步脚本的超时时间

driver.set_script_timeout(60)

driver.maximize_window()

try:

driver.get(url="http://www.newrank.cn/public/login/login.html?back=http%3A//www.newrank.cn/")

driver.find_element_by_css_selector(".login-normal-tap:nth-of-type(2)").click()

sleep(0.2)

driver.find_element_by_id("account_input").send_keys(user["mobile"])

sleep(0.5)

driver.find_element_by_id("password_input").send_keys(user["password"])

sleep(0.5)

driver.find_element_by_id("pwd_confirm").click()

sleep(3)

cookies = {user["name"]: user["value"] for user in driver.get_cookies()}

pprint(cookies)

except TimeoutException as exc:

print(exc)

except WebDriverException as exc:

print(exc)

finally:

driver.quit()

if __name__ == '__main__':

login_newrank()

# login account: 15395100590

# {'CNZZDATA1253878005': '1487200824-1499071649-%7C1499071649',

# 'Hm_lpvt_a19fd7224d30e3c8a6558dcb38c4beed': '1499074715',

# 'Hm_lvt_a19fd7224d30e3c8a6558dcb38c4beed': '1499074685,1499074713',

# 'UM_distinctid': '15d07d0d4dd82b-054b56417-9383666-c0000-15d07d0d4deace',

# 'name': '15395100590',

# 'rmbuser': 'true',

# 'token': 'A7437A03346B47A9F768730BAC81C514',

# 'useLoginAccount': 'true'}

  获取cookie后,可以将获取的cookie添加到后续请求中,但由于cookie有有效期,需要定期更新;

  这可以通过设计cookie池,动态定期登录一批账号,获取cookie后将cookie存入数据库(redis、MySQL等)来实现。

  请求时从数据库中获取一个可用的cookie,并添加到访问请求中;

  尝试使用pyqt5抓取数据(PyQt 5.9.2)

  import sys

import csv

import pyquery

from PyQt5.QtCore import QUrl

from PyQt5.QtWidgets import QApplication

from PyQt5.QtWebEngineWidgets import QWebEngineView

class Browser(QWebEngineView):

def __init__(self):

super(Browser, self).__init__()

self.__results = []

self.loadFinished.connect(self.__result_available)

@property

def results(self):

return self.__results

def __result_available(self):

self.page().toHtml(self.__parse_html)

def __parse_html(self, html):

pq = pyquery.PyQuery(html)

for rows in [pq.find("#table_list tr"), pq.find("#more_list tr")]:

for row in rows.items():

columns = row.find("td")

d = {

"avatar": columns.eq(1).find("img").attr("src"),

"url": columns.eq(1).find("a").attr("href"),

"name": columns.eq(1).find("a").attr("title"),

"fans_number": columns.eq(2).text(),

"view_num": columns.eq(3).text(),

"comment_num": columns.eq(4).text(),

"post_count": columns.eq(5).text(),

"newrank_index": columns.eq(6).text(),

}

self.__results.append(d)

with open("results.csv", "a+", encoding="utf-8") as f:

writer = csv.DictWriter(f, fieldnames=["name", "fans_number", "view_num", "comment_num", "post_count",

"newrank_index", "url", "avatar"])

writer.writerows(self.results)

def open(self, url: str):

self.load(QUrl(url))

if __name__ == '__main__':

app = QApplication(sys.argv)

browser = Browser()

browser.open("https://www.newrank.cn/public/info/list.html?period=toutiao_day&type=data")

browser.show()

app.exec_()

  持续更新:

  5. 使用 Fiddler 抓包分析

  浏览器抓包 fiddler 手机抓包

  6. 使用anyproxy 捕获客户端数据-客户端数据采集

  7. 高性能爬虫开发总结

  获取免费爬虫视频资料加887934385交流群

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线