Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >第二周实战作业:爬取一万商品数据

第二周实战作业:爬取一万商品数据

作者头像
radaren
发布于 2018-08-28 07:09:11
发布于 2018-08-28 07:09:11
39800
代码可运行
举报
运行总次数:0
代码可运行

赶集啦~~~

Aim

Result

ScreenShot

8khref

3kinformation

PrintOut

由于没有开time.sleep所以会被反扒, 卡死之后一般用ctrl+c停止那个类目爬取……

二级页面爬取成功会输出页面名,否则会输出停止页面

1234567891011

end at /jiaju/o39//rirongbaihuo/ end at 168Fail to Get Info fromhttp://cs.ganji.com/shouji/2245928138x.htmFail to Get Info fromhttp://cs.ganji.com/shouji/2245928138x.htmFail to Get Info fromhttp://cs.ganji.com/shouji/2201642961x.htmFail to Get Info fromhttp://cs.ganji.com/shouji/2201642961x.htmFail to Get Info fromhttp://cs.ganji.com/shouji/2178792516x.htmFail to Get Info fromhttp://cs.ganji.com/shouji/2178792516x.htm另外没有报错????打开上述页面发现是被买走了

Code

封装Soup

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def GetSoup(url,buquan=1):    if buquan:        wb_data = requests.get((BaseUrl + url),timeout=2) # 因为有的页面需要前缀.    else:        wb_data = requests.get(url)    wb_data.encoding = 'utf8' # 加上这句否则会乱码!!!    if wb_data.status_code == 200:        soup = BeautifulSoup(wb_data.text,'lxml')        return soup    else:        print('Fail to Get Info from'+url)        return None

得到channel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TypeSel = '#wrapper > div.content > div > div > dl > dt > a'def GetChannal(url):    soup = GetSoup(url)    if soup == None:        return None    else:        types = soup.select(TypeSel)        for type in types:            href = type.get('href')            title = type.get_text()            FirstUrl.insert_one(dict(title=title,href=href))

爬取每个channal

  1. 用set来排除重复信息(因为赶集网后面的页面会定向为同一个..)
  2. return一个爬取成功与否的值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GoodSel = '#wrapper > div.leftBox > div.layoutlist > dl > dd.feature > div > ul > li > a'ThirdSet = set()def GetGoods(url):    soup = GetSoup(url)    if soup != None:        goods = soup.select(GoodSel)        for good,p in zip(goods,range(1,10)):            title = good.get_text().strip()            href = good.get('href')            data = dict(title=title,href=href)            if data['href'] in ThirdSet:                return False            else:                ThirdSet.add(data['href'])                SecondUrl.insert_one(data)        return True    else:        return False    def GetGoodsUrl():    for up in FirstUrl.find():        base = up['href']        for p in range(1, 10000):            st = base + 'o' + str(p) + '/'            try:                if GetGoods(st) == False:                    print(base, 'end at', str(p))#爬取成功                    break            except:                print('error in page', st)#有bug                pass

爬取每个商品页面

应该开多进程的….

不过分了几个函数也不会挂得太惨咯..

place和新旧类别挺麻烦的QAQ

因为缺少信息会挂一片(比如jiaju页面很多都没有新旧…)

所以删掉try从小搞一下..来debug

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ttSel = '#wrapper > div.content.clearfix > div.leftBox > div.col-cont.title-box > h1'tmSel = '#wrapper > div.content.clearfix > div.leftBox > div.col-cont.title-box > div > ul.title-info-l.clearfix > li > i'tpSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > span > a'pcSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > i.f22.fc-orange.f-type'plSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > a'newSel = '#wrapper > div.content.clearfix > div.leftBox > div > div.det-summary > div > div.second-dt-bewrite > ul > li'def GetGoodfInfo(url):    soup = GetSoup(url,buquan=0)    if soup != None:        titles = soup.select(ttSel)[0].get_text()        timers = soup.select(tmSel)[0].get_text().split('\\')[0].strip().split('\xa0')[0]        types  = soup.select(tpSel)[5].get_text()        prices = soup.select(pcSel)[0].get_text()        places = soup.select(plSel)        place = ''.join(places[i].get_text() for i in range(1,4))        news = soup.select(newSel)[0].get_text().split(':')[1].replace('\n','').strip()        #print('place',place)        #print('type',types)        data = dict(title=titles,time=timers,type=types,price=prices,place=place,new=news)        #print(data)        Info.insert_one(data)

完整Code

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ttSel = '#wrapper > div.content.clearfix > div.leftBox > div.col-cont.title-box > h1'tmSel = '#wrapper > div.content.clearfix > div.leftBox > div.col-cont.title-box > div > ul.title-info-l.clearfix > li > i'tpSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > span > a'pcSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > i.f22.fc-orange.f-type'plSel = '#wrapper > div.content.clearfix > div.leftBox > div > div > ul > li > a'newSel = '#wrapper > div.content.clearfix > div.leftBox > div > div.det-summary > div > div.second-dt-bewrite > ul > li'def GetGoodfInfo(url):    soup = GetSoup(url,buquan=0)    if soup != None:        titles = soup.select(ttSel)[0].get_text()        timers = soup.select(tmSel)[0].get_text().split('\\')[0].strip().split('\xa0')[0]        types  = soup.select(tpSel)[5].get_text()        prices = soup.select(pcSel)[0].get_text()        places = soup.select(plSel)        place = ''.join(places[i].get_text() for i in range(1,4))        news = soup.select(newSel)[0].get_text().split(':')[1].replace('\n','').strip()        #print('place',place)        #print('type',types)        data = dict(title=titles,time=timers,type=types,price=prices,place=place,new=news)        #print(data)        Info.insert_one(data)

心得与疑问

笔记

  1. 把’>’改成’ ‘之后不一定是严格下一级元素
  2. 访问量高的网站对于同一个ip的频次会有限制
  3. lambda x:x.text
  4. import lxml解析会快很多
  5. try少量还行,,大量bug太多还是得debug
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:           GetGoodfInfo(url['href'])      except Exception as e:           print(str(e), 'fail to get ', url['href'])           pass

心得

忘了判断404…好迷……..幸好跑之前加了个try

这次爬取的数据量突然变大后感受到了爬虫的魅力.

爬取时候没有用time.sleep似乎因为本身的延迟也没有挂的太惨

写了try之后那么挂了Ctrl+c能爬取接下来另一个页面

大数据量爬取得先爬几百个测一下字符串通用性~

疑问

但是有一些疑问

  1. 爬取的页面有一部分重复了一遍…是因为系统刷新了么…
  2. 爬取了8k个url之后爬不了了…
  3. 并没有理解出爬取大量页面和爬取少量的不同哇?

答复

重复可能是因为爬取规则有问题,或者网站本身的问题,所以重复的需要处理下。 8k url爬不了这个要看他提示什么错误了,如果没有提示错误就比较不好排除了。 大量和少量的不同很多,大量的爬取需要注意更多细节的东西,这不,到8k的url就爬不了。 chmod可以整个文件夹修改的,加上-R 不用一个个文件修改

另外我发现重复似乎是因为..同时run了两个py程序往数据库里面写……….

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
爬取58同城二手手机
在开始编写代码前需要将Python3.7安装并配置于环境变量中(windows一般安装python环境后会自动添加进环境变量),以及使用pip命令安装上面提到的3个python库,这些都准备好以后开始使用PyCharm或者Sublime Text 3编写代码,这里我习惯于使用PyCharm编写python代码。 进入58同城的二手手机页面https://gy.58.com/shouji/ ,使用浏览器的开发者工具(直接按F12键即可)寻找页面规律。爬去58同城二手手机的数据。 使用shift+ctrl+c选
暖月寒星
2020/03/12
6050
爬虫 | 百行代码爬取14.5W条豆瓣图书信息
点击任意标签,分析页面请求 分别请求不同的标签页面,分析请求链接,可以发现如下规律:
咸鱼学Python
2019/10/09
5150
爬虫 | 百行代码爬取14.5W条豆瓣图书信息
《爬虫系列之爬取PPT》
叶茂林
2023/07/30
2550
Fu*k meizitu
首先通过 首页 的的所有分页面爬取所有的图片的首页链接 (写完之后发现有另一个界面 更容易爬 但是已经写完了就没有改了 这里放上链接 全部)
BORBER
2019/08/06
1.4K0
Fu*k meizitu
Python3.6+Beautiful Soup+csv 爬取豆瓣电影Top250
注:本文获取内容全部使用Beautiful Soup的select方法,使用css选择器。有html+css编程经验的可以使用css选择器,方便快捷。
geekfly
2022/04/24
5680
Python3.6+Beautiful Soup+csv 爬取豆瓣电影Top250
我的第一个爬虫,爬取北京地区短租房信息
# 导入程序所需要的库。 import requests from bs4 import BeautifulSoup import time # 加入请求头伪装成浏览器 headers = { #通过Chrome浏览器复制User-Agent 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/5
py3study
2020/01/19
5830
「Python爬虫系列讲解」五、用 BeautifulSoup 爬取电影信息
前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试 「Python爬虫系列讲解」四、BeautifulSoup 技术
荣仔_最靓的仔
2021/02/02
3.8K0
「Python爬虫系列讲解」五、用 BeautifulSoup 爬取电影信息
如何用Python爬取分析北京二手房数据?
近期,有个朋友联系我,想统计一下北京二手房的相关的数据,而自己用Excel统计工作量太过于繁杂,问我用Python该如何实现。
测试小兵
2019/07/24
9930
Python爬取重庆交通大学官网
爬取重庆交通大学官网首页的时政要闻,并提取信息,将时政要闻的时间、标题全部导出显示
Yuyy
2022/06/28
5340
Python爬取重庆交通大学官网
python爬取北京公交数据
弟大不用洗
2024/10/17
1480
爬虫 | Python爬取网页数据
之前也更过爬虫方面的内容 如何从某一网站获取数据,今天再更一次。后面会陆续更一些爬虫方面的内容(HTML, requests, bs4, re ...),中间可能会插播一些 numpy 和 pandas 方面的内容。在时间允许的情况下会更一些WRF模式方面的内容。也算是立了个更新内容的 flag,但是更新时间就不立了==
bugsuse
2020/04/21
4.7K0
爬虫 | Python爬取网页数据
上海的房租有多高?我用Python爬虫为你揭晓
今天,pk哥用 Python 爬虫给大家分析下上海的房租。我们用数据来看看上海的房租究竟有多高。
龙哥
2019/07/30
1K0
上海的房租有多高?我用Python爬虫为你揭晓
爬虫实战--拿下最全租房数据 | 附源码
上一篇的实战只是给大家作为一个练手,数据内容比较少,且官网也有对应的 API,难度不大。
小一不二三
2020/01/08
2.6K1
爬虫实战--拿下最全租房数据 | 附源码
Second python spider pro
写完第二个爬虫之后,写了好几个,但是总归是因为技术原因,达不到自己想要的效果,在重写第二个爬虫时这种感觉尤为强烈,所以写完这个之后,回去继续看剩下的网课,充实自己
BORBER
2019/08/06
6830
Python使用BeautifulSoup爬取妹子图
最近突然发现之前写的妹子图的爬虫不能用了,估计是网站又加了新的反爬虫机制,本着追求真理的精神我只好又来爬一遍了!
Awesome_Tang
2018/09/11
1.4K0
Python使用BeautifulSoup爬取妹子图
python 爬取淘宝模特信息
  通过本篇博文,介绍一下我对指定信息进行爬取的时候的思路,顺便贴一下代码。  一、首先获取想要爬取的网站的url链接的规则变化 可以看出来该网站页面的url结构简单,变化的只是https://mm.
py3study
2020/01/07
5530
python 爬取淘宝模特信息
爬取豆瓣Top250 - 1
码农GT038527
2024/11/06
990
爬取豆瓣Top250 - 1
Python爬虫系列:爬取小说并写入txt文件
本教程使用的单线程单本下载小说代码会不定期维护,最新源码及相关教程以CSDN博客为主,教程所说的多线程多本由于博主时间有限,暂时不做维护,仅作为一个教程供大家参考,感兴趣的朋友可以在此基础上做一个UI,便于下载;单线程单本代码见文末或码云>>get_one_txt.py文件,以下是维护日志:
全栈程序员站长
2022/09/02
4.4K0
数据获取:​如何写一个基础爬虫
写好一个爬虫最基本的是做好页面分析,找到链接和规律,这样在写爬虫的时候就可以有方向和目的性。接下来,我们就以爬虫最常用的豆瓣评分TOP250的内容作为爬虫的demo,以此来学习使用相关知识。
马拉松程序员
2023/09/02
2970
数据获取:​如何写一个基础爬虫
A failed spider
在爬取完漫画网站之后,我在想,我还能用自己浅薄的知识做点什么,但实在是因为自己 python的基本功不够扎实,以及自己的需求过于模糊,所以最后还是选择了爬取笔趣阁的小说。练习python,熟悉bs4 和 requsets 的使用。
BORBER
2019/08/06
6200
相关推荐
爬取58同城二手手机
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文