概述
安装:I有一个Google函数,它由消息触发到Pub/Sub主题。我已经设置了一个作业,以便每分钟向这个Pub/Sub主题发送一条消息。我的云功能被触发,并向另一个Pub/Sub主题发送消息。我设置了一个Dataflow作业,它将数据从这个Pub/Sub主题流到BigQuery。
问题:--如果我的云函数发布的消息包含一个简单的字符串,它会将其转化为BigQuery。如果消息是被刮过的网站的html代码,那么结果不会出现在BigQuery中,我不知道它在哪里丢失。
详细演练
扳机
我的函数function-3是由一条消息触发的,该消息的主题为simple。

这是我的云计划程序的工作:

它每分钟向simple主题发送一个字符串(如* * * * *所示)。
功能
我函数的源代码有两个文件:main.py和requirements.txt。
main.py使用https://www.bbc.com/并使用resuests和BeautifulSoup (bs)将其html代码作为字符串。然后,它向主题scrape发布2个字符串。这两个字符串是"publish_this“和BBC网站html的字符串版本。main.py代码
def hello_pubsub(event, context):
import re
import json
import base64
import requests
import bs4 as bs
from google.cloud import pubsub_v1
def publish(message):
project_id = "adventdalen"
topic_name = "scrape"
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_name)
future = publisher.publish(
topic_path, data=message.encode('utf-8')
)
url = "https://www.bbc.com/"
page = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'})
bspage = bs.BeautifulSoup(page.text, 'html.parser')
bspage = str(bspage)
publish(json.dumps({"html":"publish_this"})) # <- this makes into bigquery
publish(json.dumps({"html":re.escape(bspage)})) # <- this does not.requirements.txt是:
# Function dependencies, for example:
# package>=version
google-cloud-pubsub
requests
bs4数据流工作
我有一份名为ps-to-bq-scrape的数据流工作

它的目标是BigQuery表adventdalen:scrape.scrape (在上面的屏幕截图中突出显示,请参见右位),scrape为inputTopic (高亮上方4行)。
BigQuery表
在BigQuery表中,我希望拥有等同于"publish_this“的行,以及BBC网站html源代码的字符串。相反,我发现:

只有publish_this行出现。为了确保我不是通过只查看“预览”来欺骗自己,我查询不等于publish_this的每一行

我没有得到任何结果。英国广播公司的源代码在某处丢失了。
问题
我相信,上面的main.py有问题。如何修改main.py**,,使不仅是文本"**publish_this**",,而且源也能进入BigQuery行?**
(知道设置是否有问题也是有用的,而不是main.py -我认为这不太可能,这个问题可以通过修复main.py来解决。)
发布于 2022-03-07 22:01:54
可以发生的一件事是,URL没有以正确的方式解析到一个正确的字符串。我建议您使用库来解析uri,然后将其解析为字符串。
您可以使用纱,纱库来解析复杂的uri。
您可以看到这个例子:
>>> from yarl import URL
>>> url = URL('https://www.python.org/~guido?arg=1#frag')
>>> url
URL('https://www.python.org/~guido?arg=1#frag')您还可以使用urllib.parse.unquote()库,这个库处理从百分比编码的数据到UTF-8字节的解码,然后再处理文本。
您可以看到这个例子:
>>> from urllib.parse import unquote
>>> url = 'example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0'
>>> unquote(url)
'example.com?title=правовая+защита'如果解析不起作用,您能否共享数据流作业的日志,以查看输入或输出中是否有任何问题。
https://stackoverflow.com/questions/71362951
复制相似问题