PYTHON爬虫信息收集
用Python写爬虫做信息收集,爬虫第一步不是信息写代码,是收集打开浏览器。我习惯先按F12,爬虫看Network面板里XHR请求的信息返回内容。很多数据根本不用解析HTML,收集接口直接吐JSON。爬虫上个月帮朋友抓某招聘网站岗位信息,信息页面翻到第三页发现URL规律是收集 Requests库是爬虫绕不开的。 解析环节分两派。lxml的XPath定位精准,比如 信息收集绕不开分页和去重。见过新手写循环翻页,结果第2页和第1页数据重复,因为网站用POST传页码而他用GET。还有更隐蔽的坑:某论坛帖子列表按时间倒序,但翻到第10页时突然插入几条置顶帖,导致后续页码错位。解决办法是记录上一页最后一条的时间戳,下一页请求带上 存储别急着上数据库。小规模抓取,我直接 法律边界得心里有数。robots.txt里 最后说个反直觉的观察:很多信息收集失败不是因为技术不够,是目标选错了。动态渲染的SPA网站,用requests拿到的HTML里根本没有数据,得用Selenium或Playwright驱动真实浏览器。但这类工具慢且吃内存。我的判断标准很简单——打开页面右键“查看网页源代码”,如果搜索关键词能搜到,requests就够;搜不到,再考虑上浏览器。/jobs?page=3,但实际数据来自 /api/job/list?爬虫page=3&limit=20。构造这个接口请求,信息比用BeautifulSoup逐层找div快十倍。收集requests.get(url,信息 headers=headers) 这行代码谁都会写,但headers里不带User-Agent,收集多数网站直接返回403。我试过用默认UA抓某电商评论,前50页正常,第51页开始全是验证码。换了个Chrome的UA字符串,问题消失。这不是玄学,是服务端在检查请求指纹。//div[@class="price"]/text() 直接拿到价格文本。但有些网站class名随机生成,今天叫 price_3xK9,明天变成 price_7mQ2。这时候正则反而更稳,re.findall(r'price">([\d.]+)<', html) 能扛住结构微调。我通常两种混用,XPath取大块,正则抠细节。before=timestamp 参数。这比算页码可靠。csv.writer 写文件,字段用逗号隔开。超过五万条再考虑SQLite,INSERT OR IGNORE 能自动跳过重复主键。有一次抓了二十万条商品数据,用pandas的 drop_duplicates(subset='sku_id') 去重,内存直接爆了。后来改成边抓边写SQLite,加个唯一索引,问题解决。Disallow: /search 就别碰搜索接口。我见过有人抓某政府公开数据,频率设成每秒20次,IP被封了还换代理继续。这已经不是技术问题。合理做法是 time.sleep(random.uniform(1,3)),模拟人类翻页节奏。某次抓天气历史数据,网站没写反爬,但我每请求一次就等2秒,三千条数据跑了一个半小时,全程没触发任何限制。