【学习交流】python简易爬虫入门

哦,是的,都有。
測試大量文件時報錯:9千多個html

Traceback (most recent call last):
  File "G:\2000.py", line 35, in <module>
    content = f2.read()
  File "C:\Programs\Python\Python39\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 338: invalid continuation byte

merger.py (1.4 KB)
用这个,看看是读到哪个文件报错,把报错的文件传我看看。

1 个赞

測試合併.rar (294.7 KB)
您試下合併。

看了下,这些测试网页的编码是 gbk 的,只需要把 f2 这一行的 utf-8 改成 gbk 就能正常处理了。python3 能处理的编码,在这里能看到:

中文常用编码有 gb2312, gbk, gb18030,再出现类似编码错误,可以尝试替换下。

謝謝,試了下,部分文件可以了。大批量的很難圓滿。這個問題先擱置了。不算是大問題,合併可以用其他方法解決。

1 个赞

@ last_idol再請教一下:像這個網站【善】字墨迹书法写法_书法字典_墨客网
點擊加載更多的,怎樣抓取?

类似元素截图,元素也可以点击的。加上 while True 循环点击就可以了,供参考:

# 等待2秒,确保动态网页也可以爬取
time.sleep(2)

while True:
    time.sleep(2)
    elem = page.query_selector("#more")
    if not elem or elem.is_disabled():
        break
    elem.click()

# 读取网页内容
content = page.content()
# 打印文本行,去除前后空格换行,响应内容长度
print('current: ', i, line, len(content))

1 个赞

成功运行!
像这个赠荷花原文、翻译及赏析_李商隐古诗_古诗文网
应该怎么改写?套用好像不行

这个要复杂些,需要先提取出所有相关的 a 标签,判断那个 a 标签是否隐藏,再点击,可以参考下面代码的实现。如果还有更复杂的情况可以参考后面两个链接中的文档。

# 等待2秒,确保动态网页也可以爬取
time.sleep(2)

# 查询所有需要展开的 a 标签
elements = page.query_selector_all("a:has-text('展开阅读全文 ∨')")
# 遍历 a 标签
for elem in elements:
    # 判断 a 标签是否可见
    if elem.is_visible():
        # 点击 a 标签,展开
        elem.click()
        # 等待2秒,确保动态网页加载完
        time.sleep(2)

# 读取网页内容
content = page.content()
# 打印文本行,去除前后空格换行,响应内容长度
print('current: ', i, line, len(content))

https://playwright.dev/python/docs/selectors#text-selector

3 个赞

测试通过,厉害了 :+1:

2 个赞

要是没有索引地址,抓取整站怎样写?比如https://www.gushiwen.cn/,抓取所有链接

playwright 不适合没有索引的情况,下载整站建议直接用现成的工具。

2 个赞

哦,是這樣。離線工具對此站用不了。

@last_idol 請教一下:正在嘗試弄 wiktionary,想偷個懶用網頁的 .js,能不能幫忙看一眼?

主要的功能好像都在這個 .php 裏,也用到 mediawiki,可能有用的文件我都打包了

test.7z (510.5 KB)
https://en.wiktionary.org/wiki/free

那个 php 过于复杂了,我也看不懂。

1 个赞

也感謝了⠀⠀

请教一下大侠,我在用您写的这个
抓取.py (921 字节)
抓取网站,由于网站有封锁,时不时导致异常,但PY程序不会自动终止,而是卡在那里不动,如果 手动停止再重新运行此PY,则又恢复正常。请问有没有什么方法能让它每隔一段时间(比如1小时)自动重启运行?晚上挂机,经常卡在半夜不动。。。

加 timeout,while try except 包着

最好帮我修改下代码,我不会写。。。

抓取.py (1.1 KB)

手写的,我没有试,看看能不能跑起来。报错的话,把错误提示发出来。