<span>使用selenium+BeautifulSoup 抓取京东商城手机信息</span>

1.准备工作:

  1. chromedriver  传送门:国内:http://npm.taobao.org/mirrors/chromedriver/   vpn:
  2. selenium 
  3. BeautifulSoup4(美味汤)
pip3 install selenium              
pip3 install BeautifulSoup4

  chromedriver 的安装请自行百度。我们直奔主题。

起飞前请确保准备工作以就绪...

2.分析网页:

 目标网址:https://www.jd.com/

 

所有item均保存在class="gl-item"里面

需求:

  • 使用selenium 驱动浏览器自动侦测到input输入框,输入框中输入“手机”,点击搜索按钮.
  • 使用seleinum抓取发挥页面的总页码,并模拟手动翻页
  • 使用BeautifulSoup分析页面,抓取手机信息

 从入口首页进入查询状态

 1 # 定义入口查询界面
 2 def search():
 3     browser.get('https://www.jd.com/')
 4     try:
 5         # 查找搜索框及搜索按钮,输入信息并点击按钮
 6         input = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key")))
 7         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button")))
 8         input[0].send_keys('手机')
 9         submit.click()
10         # 获取总页数
11         page = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')))
12         return page[0].text
13     # 如果异常,递归调用本函数
14     except TimeoutException:
15         search()

查询结束后模拟翻页

 1 # 翻页
 2 def next_page(page_number):
 3     try:
 4         # 滑动到网页底部,加载出所有商品信息
 5         browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
 6         time.sleep(4)
 7         html = browser.page_source
 8         # 当网页到达100页时,下一页按钮失效,所以选择结束程序
 9         while page_number == 101:
10             exit()
11         # 查找下一页按钮,并点击按钮
12         button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em')))
13         button.click()
14         # 判断是否加载到本页最后一款产品Item(每页显示60条商品信息)
15         wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)")))
16         # 判断翻页成功
17         wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number)))
18         return html
19     except TimeoutException:
20         return next_page(page_number)

解析页面上的a标签

# 解析每一页面上的a链接
def parse_html(html):
    """
    解析商品列表网页,获取商品的详情页
    """

    soup = BeautifulSoup(html, 'html.parser')
    items = soup.select('.gl-item')
    for item in items:
        a = item.select('.p-name.p-name-type-2 a')
        link = str(a[0].attrs['href'])
        if 'https:' in link:
            continue
        else:
            link = "https:"+link
        yield link

根据url 截取商品id 获取价格信息

# 获取手机价格,由于价格信息是请求另外一个地址https://p.3.cn/prices/mgets?skuIds=J_+product_id
def get_price(product_id):
    url = 'https://p.3.cn/prices/mgets?skuIds=J_' + product_id
    response = requests.get(url,heeders)
    result = ujson.loads(response.text)
    return result

进入item商品详情页

# 进入详情页
def detail_page(link):
    """
    进入item详情页
    :param link: item link
    :return: html
    """
    browser.get(link)
    try:
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)
        html = browser.page_source
        return html
    except TimeoutException:
        detail_page(link)
 1 # 获取详情页的手机信息
 2 def get_detail(html,result):
 3     """
 4     获取详情页的数据
 5     :param html:
 6     :return:
 7     """
 8     dic ={}
 9     soup = BeautifulSoup(html, 'html.parser')
10     item_list = soup.find_all('div', class_='Ptable-item')
11     for item in item_list:
12         contents1 = item.findAll('dt')
13         contents2 = item.findAll('dd')
14         for i in range(len(contents1)):
15             dic[contents1[i].string] = contents2[i].string
16 
17     dic['price_jd '] = result[0]['p']
18     dic['price_mk '] = result[0]['m']
19     print(dic)

滴滴滴.. 基本上的思路就酱紫咯.. 传送门依旧打开直github: https://github.com/shinefairy/spider/

end~

全部评论

相关推荐

1.&nbsp;自我介绍2.&nbsp;项目都是自己写的吗?3.&nbsp;我看你用&nbsp;koa2&nbsp;写后端,为什么选择它,能讲讲吗?4.&nbsp;那你提到&nbsp;koa2&nbsp;它是不提供中间件的,你是怎么解决的?5.&nbsp;中间件的原理是什么?(洋葱模型)6.&nbsp;你刚刚说碰到&nbsp;next()&nbsp;就进入下一个中间件,那&nbsp;next&nbsp;只能执行同步,如果是异步的话,你是怎么处理的?(async/await,但是我发现,有的中间件需要在异步中间件之前执行,所以我用&nbsp;try/catch&nbsp;来处理异步中间件的异常)7.&nbsp;JS&nbsp;异步发展史,以及它们的优缺点说一下&nbsp;(回调函数--Promise--Generator--async/await)8.&nbsp;你刚刚说&nbsp;Promise&nbsp;状态不能更改,那如果我要设计一个能修改&nbsp;Promise&nbsp;状态的函数,你会怎么设计?9.&nbsp;CSS&nbsp;水平垂直居中的方法(flex、grid、绝对定位&nbsp;+&nbsp;margin:auto、绝对定位&nbsp;+&nbsp;负&nbsp;margin、绝对定位&nbsp;+&nbsp;transform、table-cell)10.&nbsp;你刚刚说到&nbsp;flex&nbsp;布局,那&nbsp;flex:1&nbsp;是什么意思?(flex:&nbsp;flex-grow&nbsp;&nbsp;flex-shrink&nbsp;&nbsp;flex-basis;等价&nbsp;flex:1&nbsp;1&nbsp;0%表示元素可以均分剩余空间,可拉伸、可压缩,不依赖内容宽度,自动自适应填充布局。)11.&nbsp;父容器宽是&nbsp;500px,然后它左右各有两个子容器是&nbsp;100px,如果设置&nbsp;flex:&nbsp;1,那它的宽度是多少?(500-100-100=300px)12.&nbsp;说说你对浏览器缓存的理解(强缓存、协商缓存)13.&nbsp;如果一个用户,他怎么去刷新都无法刷到最新版的代码,你能说下可能的原因吗?(版本号、hash等)还有吗?(我说我不知道了,面试官说还有&nbsp;CDN&nbsp;没有同步,我说企业才会这么干,自己写项目一般不会,我知道&nbsp;cdn&nbsp;是用来解决高并发的手段)14.&nbsp;React你熟吗?说下&nbsp;React&nbsp;函数组件和类组件的区别15.&nbsp;怎么避免&nbsp;Hooks&nbsp;导致组件重新渲染?(使用&nbsp;useCallback、useMemo、React.memo、useRef等等)16.&nbsp;谈一下我对&nbsp;React&nbsp;的状态管理的理解(Redux、Mobx、Zustand,我说&nbsp;Zustand&nbsp;用的最多)17.&nbsp;React&nbsp;常见的&nbsp;hooks&nbsp;有哪些?(useState、useEffect、useRef、useCallback、useMemo、useReducer、useContext、useImperativeHandle、useLayoutEffect、useDebugValue)18.&nbsp;TS&nbsp;你熟吗?我们引进&nbsp;TS&nbsp;的目的是为什么?19.&nbsp;interface&nbsp;和&nbsp;type&nbsp;的区别20.&nbsp;说下&nbsp;TS&nbsp;里的泛型21.&nbsp;我现在有十个字段,比如十个字段就要&nbsp;A&nbsp;B&nbsp;C&nbsp;D&nbsp;E&nbsp;F&nbsp;G&nbsp;这种。那我现在另有另外一个方法,这个方法接受的参数呢,必须是这个&nbsp;interface&nbsp;A&nbsp;里面的这个&nbsp;K。就比如说你可以是&nbsp;A&nbsp;B&nbsp;C&nbsp;可以&nbsp;A&nbsp;B&nbsp;C&nbsp;D&nbsp;任何组合都可以,但是必须是这个&nbsp;interface&nbsp;里面的&nbsp;A&nbsp;里面的定义的。这个&nbsp;K&nbsp;这种类型的话是怎么去定义呢?(说实话我有点不太理解啥意思,反正我说了&nbsp;keyof)```&nbsp;TypeScriptinterface&nbsp;Obj&nbsp;{A:&nbsp;stringB:&nbsp;stringC:&nbsp;stringD:&nbsp;stringE:&nbsp;string//&nbsp;其他字段...}```22.&nbsp;vite&nbsp;用过吗?说说和&nbsp;webpack&nbsp;的区别。vite&nbsp;的优缺点是什么23.&nbsp;说说&nbsp;Tree&nbsp;shaking(树摇)&nbsp;和&nbsp;Code&nbsp;Splitting&nbsp;(代码分割)的区别24.&nbsp;Git&nbsp;你熟吗?说说&nbsp;git&nbsp;merge&nbsp;和&nbsp;git&nbsp;rebase&nbsp;的区别,什么时候用&nbsp;git&nbsp;merge,什么时候用&nbsp;git&nbsp;rebase?25.&nbsp;web3&nbsp;你熟吗?(不太熟,听说过而已)26.&nbsp;我看你自我介绍说了&nbsp;AI,你是怎么用的?27.&nbsp;除了提示词,还有什么能让&nbsp;AI&nbsp;更聪明?28.&nbsp;AI&nbsp;的优缺点你说一下29.&nbsp;AI&nbsp;发展这么快,你觉得我们以后会扮演什么角色?30.&nbsp;反问基本都答上来了。面了我80分钟,我还以为稳过的
查看29道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务