Python中scrapy请求某繁体网站内容不一致的原因是什么?
http://www.hkexnews.hk/APP/SEHKAppMainIndex_c.htm
这个网站我用 request 请求没有问题 但是 scrapy 就出现下面字体
††††††††††††††㌮‼愠桲敦㴢卅䡋䅐偌楳瑥摃慳敟挮桴洢㻥랲諥뢂㰯愾㰯獴牯湧㸼⽰㸍ਠ††††††††††††††‼瀠慬楧渽≬敦琢㸼獴牯湧㸍ਠ††††††††††††††‴⸠㱡牥昽≨瑴瀺⼯睷眲步确敷献桫⽎敷┲が楳瑩湧猯䅰灬楣慴楯渥㈰偲潯春㈰慮搥㈰偈䥐⽒整畲湥搯䵡楮┲あ潡牤㽳损污湧㵺栭䡋∾ꯧ馼鸼⽡㸼⽳瑲潮朾㰯瀾㱢爾㱰汩杮㴢汥晴∾㱳瑲潮朾駨ꢻ㨼⽳瑲潮朾㱴慢汥㸍ਠ††††††††††††††††‼瑲㸍ਠ†††††††††††††††††‼瑤㻢鞏㰯瑤㸍ਠ†††††††††††††††††‼瑤㻦ꂹ髤뢻뿤뢊苨ꚏ蟧견臥薫䇧ꮠ諥뢂蓧钟ꧧꞑ胥薬룯벌뛥邍뇧떐뻦鲉豂跥궗ꗤ붜駨궘舼⽴搾ഊ†††††††††††††††††㰯瑲㸍ਠ††††††††††††††††‼瑲㸍ਠ†††††††††††††††††‼瑤㻢鞏㰯瑤㸍ਠ†††††††††††††††††‼瑤㻥薷跥邌闧ꖨ諦麶诧骄볨ꆌ뫯벌뛥邍뇧떐뻦鲉豗跥궗ꗤ붜駨궘舼⽴搾ഊ†††††††††††††††††㰯瑲㸍ਠ†††††††††††††††‼⽴慢汥㸍ਠ††††††††††††††‼⽰㸍ਠ†††††††††††††‼⽤楶㸼⽳灡渾㰯瑤㸍ਠ††††††††††‼⽴爾ഊ†††††††††††㱴爾ഊ††††††††††††㱴搠捯汓灡渽∲∾㱳灡渠楤㴢印慮ㄢ污獳㴢灭楮束扬慣欱㑢∾㱤楶瑹汥㴢摩獰污示楮汩湥∾㰯摩瘾㰯獰慮㸼⽴搾ഊ†††††††††††㰯瑲㸍ਠ††††††††††‼呒㸍ਠ†††††††††††‼呄潬印慮㴢㈢㸼獰慮污獳㴢灭楮朱㈢㸼獴牯湧㸼扲㸼扲㸼瀾돨ꮋ裦鲬諨膆諥뺌蟦隙蘼⽰㸼⽳瑲潮朾㰯獰慮㸼⽔䐾ഊ†††††††††††㰯呒㸍ਠ††††††††††‼瑲㸍ਠ†††††††††††‼瑤潬印慮㴢㈢㸍ਠ††††††††††††‼瑡扬攠獴祬攽≷楤瑨㨶〰灸∠捬慳猽≴慢汥彧牥祟扯牤敲猭牴敔慢汥ⵂ汵敔慢汥彃䡉∠獵浭慲礽∢⁷楤瑨㴢㘰〢㸍ਠ†††††††††††††‼瑢潤社ഊ†††††††††††††††㱴爾ഊ††††††††††††††††㱴搠睩摴栽∵〢㸼業朠獲挽∯業慧支獰慣敲楦∠睩摴栽∵〢敩杨琽∵∾㰯瑤㸍ਠ†††††††††††††††‼瑤⁷楤瑨㴢㠰∾들뮽㰯瑤㸍ਠ†††††††††††††††‼瑤⁷楤瑨㴢㐷〢㸼愠桲敦㴢卅䡋奥慲㈰ㄳ彣瑭∾㈰ㄳ㰯愾♮扳瀻♮扳瀻㱡牥昽≓䕈䭙敡爲〱㑟挮桴洢㸲〱㐼⽡㸦湢獰㬦湢獰㬼愠桲敦㴢卅䡋奥慲㈰ㄵ彣瑭∾㈰ㄵ㰯愾♮扳瀻♮扳瀻㱡牥昽≓䕈䭙敡爲〱㙟挮桴洢㸲〱㘼⽡㸦湢獰㬦湢獰㬼愠桲敦㴢卅䡋奥慲㈰ㄷ彣瑭∾㈰ㄷ㰯愾♮扳瀻♮扳瀻㱡牥昽≓䕈䭙敡爲〱㡟挮桴洢㸲〱㠼⽡㸦湢獰㬦湢獰㬼⽴搾ഊ†††††††††††††††㰯瑲㸍ਠ††††††††††††††‼瑲㸍ਠ†††††††††††††††‼瑤㸼⽴搾ഊ††††††††††††††††㱴搠捯汳灡渽∲∾㱡牥昽≄潣畭敮瑳⽓䕈䭃潮獯汩摡瑥摉湤數彣汳∠瑩瑬攽∢⁴慲来琽≟扬慮欢㻤뢋觧뚜裧뒢锼⽡㸼⽴搾ഊ†††††††††††††††㰯瑲㸍ਠ†††††††††††††‼⽴扯摹㸍ਠ††††††††††††‼⽴慢汥㸍ਠ†††††††††††‼⽴搾ഊ†††††††††††㰯瑲㸍ਠ††††††††††‼瑲㸍ਠ†††††††††††‼瑤潬印慮㴢㈢㸼獰慮搽≓灡渱∠捬慳猽≰浩湧彧牥礱㌵戢㸼摩瘠獴祬攽≤楳灬慹㩩湬楮攢㸼扲㸼⽤楶㸼⽳灡渾㰯瑤㸍ਠ††††††††††‼⽴爾ഊ†††††††††††㱴爾ഊ††††††††††††㱴搠捯汓灡渽∲∾㱳灡渠捬慳猽≶敲摟扬
Python中scrapy请求某繁体网站内容不一致的原因是什么?
编码问题.
我遇到过类似问题,通常是因为网站检测到Scrapy的请求头与浏览器不同,返回了不同版本的内容。繁体网站可能针对不同客户端返回简繁不同的内容。
主要检查这几个点:
- User-Agent - 有些网站会根据User-Agent判断客户端类型
- Accept-Language - 繁体网站可能优先返回zh-TW或zh-HK
- Cookies/Session - 网站可能通过cookies记录语言偏好
- IP地理位置 - 某些网站根据IP返回对应区域内容
试试这个完整的爬虫示例:
import scrapy
class TraditionalChineseSpider(scrapy.Spider):
name = 'traditional_chinese'
def start_requests(self):
url = 'https://example.com/traditional-site'
# 设置完整的浏览器请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Cache-Control': 'max-age=0'
}
yield scrapy.Request(
url=url,
headers=headers,
callback=self.parse,
meta={'dont_redirect': True} # 防止重定向到其他版本
)
def parse(self, response):
# 检查返回的内容编码
print(f"Encoding: {response.encoding}")
print(f"Headers: {response.headers}")
# 查看实际返回的HTML前500字符
print(response.text[:500])
# 如果需要,可以强制转换编码
# response = response.replace(encoding='big5') # 繁体中文常用编码
如果还是不一致,可以:
- 用
scrapy shell实时测试不同请求头效果 - 检查网站是否有
?lang=zh-tw之类的参数 - 对比浏览器开发者工具中的完整请求
建议先确认网站是否真的有针对爬虫返回不同内容。
resp.text.encode(‘latin-1’).decode(‘utf-8’)
这都不知道还玩爬虫呢…
In [10]: response.body.decode(encoding=“utf-8”)
Out[10]: '\ufeff<html lang=“en” class=“news-hkex”>\r\n <head>\r\n <META http-equiv=“Content-Type” content=“text/html; charset=utf-16”>\r\n <meta name=“MS.LOCALE” content=“ZH-TW”>\r\n <title>:: HKEX :: HKEXnews ::</title>\r\n <meta http-equiv=“Pragma” content=“no-cache”>\r\n <meta http-equiv=“Cache-Control” content=“no-cache”>\r\n <meta charset=“UTF-8”>\r\n <meta name=“viewport” content=“width=device-width, initial-scale=1”>\r\n <meta http-equiv=“X-UA-Compatible” content=“IE=edge”>\r\n <link href="/ncms/css/main.css" rel=“stylesheet”><script language=“javascript” src="/script/hkex_common.js"></script><script language=“javascript” src="/script/hkex_setting.js"></script><script type=“text/javascript” src="/ncms/script/hkex_app.js"></script><script type=“text/javascript” src="/ncms/script/hkex_settings.js"></script><script type=“text/javascript” src="/ncms/script/hkex_widget.js"></script><script type=“text/javascript” src="/ncms/script/vendor.js"></script><script type=“text/javascript”>\n \t var pageDefaultTitle = “申請版本,聆訊後資 料集及相關資料”;\n \t var pageDefaultSubTitle = “”;\n \t var pageDefaultBanner = “/ncms/media/HKEXnews/top_banner_bg.png”;\n \t var pageDefaultTabletBanner = “/ncms/media/HKEXnews/top_banner_bg_tablet.png”;\n \t var overrideBreadcrumb = [{\n \t \t\ttitle: “申請版本,聆訊後資料集及相關資料”,\n \t \t\turl: “http://www2.hkexnews.hk/New-Listings/Application-Proof-and-PHIP?sc_lang=zh-HK”\n \t },{\n \t \t\ttitle: “新上市”,\n \t \t\turl: window.location.href\n \t \t\t}]\n \t var overridePageTools = {};\n \t overridePageTools.showlastupdate = 0;\n \t overridePageTools.showprint = 0;\n\t\t </script><link rel=“stylesheet” href="/css/hkex_css.css" type=“text/css”><script type=“text/javascript”>\n\t\t\t\t\t\tfunction PrintFriendlyUTF()
从表面上看,scrapy 请求返回的数据被 decode(使用 latin-1|ISO-8859-1),所以 encode(‘latin-1’).decode(‘utf-8’)就行
#2 #4 都行
你一开始就知道
你用 scrapy 试过吗?我试过打印的是空
print(response.text.encode(‘latin-1’).decode(‘utf-8’)) 我这样写的
def parse(self, response):
print(response.body.decode(encoding=“utf-8”))
linkList =response.body.decode(encoding=“utf-8”).xpath(
‘//td[class=“pming_black12 ms-rteTableOddCol-BlueTable_CHI”]/a/href’)
nameList = response.body.decode(encoding=“utf-8”).xpath(
‘//td[class=“pming_black12 ms-rteTableOddCol-BlueTable_CHI”]/a/text()’)
我在 scrapy 里面这样写好像不行,说这是字符串没有 xpath,如何写才是正确的
你还是多搞搞基础吧, 没办法一步一步教你
编码的问题,我一般是这么解决的
import requests
response = requests.get(‘http://xxxxxx’)
response.encoding = “gbk2312” # 这里就是对方网站的编码格式
print(response.text)
这样一般就该返回的正常的,不会乱码了

