python大规模爬取京东

本文介绍如何使用Python的requests、BeautifulSoup等工具爬取京东商品信息,包括解析网页、抓取图片URL及使用多线程提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python大规模爬取京东

主要工具

  • scrapy

  • BeautifulSoup

  • requests

分析步骤

  • 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点

  • 我们可以看到这个页面并不是完全的,当我们往下拉的时候将会看到图片在不停的加载,这就是ajax,但是当我们下拉到底的时候就会看到整个页面加载了60条裤子的信息,我们打开chrome的调试工具,查找页面元素时可以看到每条裤子的信息都在<li class='gl-item'></li>这个标签中,如下图:

生成图

  • 接着我们打开网页源码就会发现其实网页源码只有前30条的数据,后面30条的数据找不到,因此这里就会想到ajax,一种异步加载的方式,于是我们就要开始抓包了,我们打开chrome按F12,点击上面的NetWork,然后点击XHR,这个比较容易好找,下面开始抓包,如下图:

抓包图

  • 从上面可以找到请求的url,发现有很长的一大段,我们试着去掉一些看看可不可以打开,简化之后的url=https://search.jd.com/s_new.p...{0}&s=26&scrolling=y&pos=30&show_items={1}
    这里的showitems是裤子的id,page是翻页的,可以看出来我们只需要改动两处就可以打开不同的网页了,这里的page很好找,你会发现一个很好玩的事情,就是主网页的page是奇数,但是异步加载的网页中的page是偶数,因此这里只要填上偶数就可以了,但是填奇数也是可以访问的。这里的show_items就是id了,我们可以在页面的源码中找到,通过查找可以看到idli标签的data-pid中,详情请看下图

id

  • 上面我们知道怎样找参数了,现在就可以撸代码了

代码讲解

  • 首先我们要获取网页的源码,这里我用的requests库,安装方法为pip install requests,代码如下:

    def get_html(self):
        res = requests.get(self.url, headers=self.headers)
        html = res.text     
        return html    #返回的源代码
  • 根据上面的分析可以知道,第二步就是得到异步加载的url中的参数show_items,就是li标签中的data-pid,代码如下:

    def get_pids(self):
        html = self.get_html()
        soup = BeautifulSoup(html, 'lxml')    #创建BeautifulSoup对象
        lis = soup.find_all("li", class_='gl-item')   #查找li标签
        for li in lis:
            data_pid = li.get("data-pid")      #得到li标签下的data-pid
            if (data_pid):
                self.pids.add(data_pid)    #这里的self.pids是一个集合,用于过滤重复的
  • 下面就是获取前30张图片的url了,也就是主网页上的图片,其中一个问题是img标签的属性并不是一样的,也就是源码中的img中不都是src属性,一开始已经加载出来的图片就是src属性,但是没有加载出来的图片是data-lazy-img,因此在解析页面的时候要加上讨论。代码如下:

    def get_src_imgs_data(self):
        html = self.get_html()
        soup = BeautifulSoup(html, 'lxml')
        divs = soup.find_all("div", class_='p-img')  # 图片
        # divs_prices = soup.find_all("div", class_='p-price')   #价格
        for div in divs:
            img_1 = div.find("img").get('data-lazy-img')  # 得到没有加载出来的url
            img_2 = div.find("img").get("src")  # 得到已经加载出来的url
            if img_1:
                print img_1
                self.sql.save_img(img_1)
                self.img_urls.add(img_1)
            if img_2:
                print img_2
                self.sql.save_img(img_2)
                self.img_urls.add(img_2)

前三十张图片找到了,现在开始找后三十张图片了,当然是要请求那个异步加载的url,前面已经把需要的参数给找到了,下面就好办了,直接贴代码:

    def get_extend_imgs_data(self):
        # self.search_urls=self.search_urls+','.join(self.pids)
        self.search_urls = self.search_urls.format(str(self.search_page), ','.join(self.pids))  #拼凑url,将获得的单数拼成url,其中show_items中的id是用','隔开的,因此要对集合中的每一个id分割,page就是偶数,这里直接用主网页的page加一就可以了
        print self.search_urls
        html = requests.get(self.search_urls, headers=self.headers).text   #请求
        soup = BeautifulSoup(html, 'lxml')   
        div_search = soup.find_all("div", class_='p-img')   #解析
        for div in div_search:  
            img_3 = div.find("img").get('data-lazy-img')    #这里可以看到分开查找img属性了
            img_4 = div.find("img").get("src")

            if img_3:    #如果是data-lazy-img
                print img_3
                self.sql.save_img(img_3)    #存储到数据库
                self.img_urls.add(img_3)      #用集合去重
            if img_4:    #如果是src属性
                print img_4
                self.sql.save_img(img_4)     
                self.img_urls.add(img_4)
  • 通过上面就可以爬取了,但是还是要考虑速度的问题,这里我用了多线程,直接每一页面开启一个线程,速度还是可以的,感觉这个速度还是可以的,几分钟解决问题,总共爬取了100个网页,这里的存储方式是mysql数据库存储的,要用发哦MySQLdb这个库,详情自己百度,当然也可以用mogodb但是还没有学呢,想要的源码的朋友请看GitHub源码

拓展

写到这里可以看到搜索首页的网址中keywordwq都是你输入的词,如果你想要爬取更多的信息,可以将这两个词改成你想要搜索的词即可,直接将汉字写上,在请求的时候会自动帮你编码的,我也试过了,可以抓取源码的,如果你想要不断的抓取,可以将要搜索的词写上文件里,然后从文件中读取就可以了。以上只是一个普通的爬虫,并没有用到什么框架,接下来将会写scrapy框架爬取的,请继续关注我的博客哦!!!

本人博客

### 使用Python编写程序爬取京东网站的数据 #### 选择合适的库和技术栈 对于爬取京东商品数据的任务,可以选择多种技术和工具组合来实现这一目标。考虑到京东页面的动态加载特性以及反爬机制的存在,推荐采用Selenium与lxml相结合的方式来进行操作[^1]。 - **Selenium**: 这是一个强大的Web浏览器自动化工具,能够模拟真实用户的浏览行为,非常适合处理JavaScript渲染后的网页内容。 - **lxml**: 提供高效的HTML/XML解析功能,在抓取到完整的DOM结构之后可用于精准定位并抽取所需的元素信息。 另外,为了提高效率和稳定性还可以考虑引入其他辅助组件: - **Requests/Session对象**:用于管理会话状态保持登录身份验证等功能; - **BeautifulSoup4** :当不需要特别高的性能时可作为替代方案之一进行简单的标签筛选; - **Scrapy框架** : 如果项目规模较大,则建议构建基于此框架的应用以便更好地组织代码逻辑[^2]。 #### 编写基本的爬虫脚本 下面给出一段利用上述提到的技术堆栈编写的简单示例代码片段,展示了如何启动Chrome无头模式下的WebDriver实例访问指定URL地址,并从中提取特定的商品详情链接列表保存至本地文件中。 ```python from selenium import webdriver from lxml import etree import time def get_product_links(url, page_num=1): options = webdriver.ChromeOptions() options.add_argument('--headless') # 设置为无界面运行 driver = webdriver.Chrome(options=options) product_urls = [] try: while True: print(f'Crawling Page {page_num}') driver.get(url.format(page=(page_num * 2 - 1))) # 构造分页参数 html_content = driver.page_source tree = etree.HTML(html_content) items = tree.xpath('//div[@class="gl-i-wrap"]') for item in items[:]: link = 'https:' + item.find('.//a').get('href') product_urls.append(link.strip()) next_button_disabled = bool(tree.xpath("//a[text()='下一页' and @disabled='true']")) if not next_button_disabled: page_num += 1 continue break finally: driver.quit() return product_urls if __name__ == '__main__': base_url = "https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&page={page}" links = get_product_links(base_url) with open('./products.txt', mode='w+', encoding='utf-8') as f: f.write('\n'.join(links)) ``` 这段代码实现了对某类目下多页商品记录的遍历读取过程,并将每条记录对应的跳转路径汇总输出到了文本文件里。需要注意的是实际部署前应当仔细阅读目标站点的服务条款确保合规性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值