一只简单的多线程爬虫,爬取京东网站

本文介绍了一种使用Python实现的京东手机价格爬虫程序。该程序利用多线程技术提高爬取效率,并采用XPath解析手机详情页面,最终将数据保存至MongoDB数据库。

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

#多线程爬取京东页面
#-*-encoding:utf-8-*-

#导入线程池
from multiprocessing.dummy import Pool as Threadpool
import sys#解决编码问题
import requests
import time
from lxml import etree#解析网页
import json
import pymongo

#手机价格链接
phone_u='https://p.3.cn/prices/mgets?&skuIds=J_'

#获取手机首页内容
def get_html_response(url):
    count=1
    html=requests.get(url,headers=headers)
    #解析网页
    selector=etree.HTML(html.text)
    #每个手机的连接,xpath解析网页只要会写路径就能得到连接 //*[@id="J_goodsList"]/ul/li[1]
    phone_list=selector.xpath('//*[@id="J_goodsList"]/ul/li')#这样就得到了包含手机链接数字的li列表
    for i in phone_list:
        try:
            sku_id=i.xpath('@data-sku')[0]#li标签中获取属性为data-sku的值,即链接的数字值
            #得到真实的每一个手机的url链接
            phone_url='https://item.jd.com/{}.html'.format(str(sku_id))
            # print(phone_url)
            get_phone_data(phone_url,count)
            count+=1
        except Exception as e:
            print(e)
            continue
    time.sleep(2)

#获取每一个手机的详细信息
def get_phone_data(phone_url,count):
    #用一个字典来保存手机数据
    phone_dict={}
    html=requests.get(phone_url,headers=headers)
    # 解析网页
    selector = etree.HTML(html.text)
    #通过xpath得到包含手机各种产品信息的ul列表
    phone_infos=selector.xpath('//ul[@class="parameter2 p-parameter-list"]')#找到class是。。。的ul标签
    #获取手机的信息

    for phone in phone_infos:

        #获取商品价格
        phone_number=phone.xpath('li[2]/@title')[0]
        phone_price=get_phone_price(phone_number)


        phone_dict['商品名称']=phone.xpath('li[1]/@title')[0]
        phone_dict['商品编号'] =phone_number
        phone_dict['商品价格']=phone_price
        phone_dict['商品毛重'] = phone.xpath('li[3]/@title')[0]
        phone_dict['商品运存'] = phone.xpath('li[10]/@title')[0]
        print('',count,'条数据提取完毕')
    print(phone_dict)
    save(phone_dict)

#爬取手机的价格信息,价格信息JS动态加载
def get_phone_price(sku_id):
    #获取手机价格的url链接
    phone_url=phone_u+str(sku_id)
    #爬取页面,这是一个js页面
    r=requests.get(phone_url,headers=headers).content
    #页面内容转为json数据格式
    r_json=json.loads(r)
    # # #遍历循环得到json数据格式中的价格
    for i in r_json:
        return (i.get('p'))
    # print(r)
    # print(phone_url)

#将爬取的信息保存到mongodb数据库中
def save(list):
    client=pymongo.MongoClient('localhost')
    db=client['phone_dict']#数据库
    content=db['jd']#数据表
    content.insert(list)#将数据插入保存到数据库中

if __name__=='__main__':

    #全局变量headsers
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.7.0.16013'
    }
    urls=[]
    #初始化十个页面
    for i in range(1,7,2):#页数不为2,全部是单数页
        urls.append('https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page={}&s=58&click=0'.format(str(i)))

    #创建线程池
    pool=Threadpool(2)
    #线程开始时间
    start_time=time.time()
    #线程开始并将urls列表中的链接一一映射到get_html_response函数中
    pool.map(get_html_response,urls)
    #线程池关闭
    pool.close()
    #主线程等待子线程
    pool.join()
    #结束时间
    end_time=time.time()
    tt=end_time-start_time
    print('共用了',tt,'秒的时间爬取网页')
### 使用Python爬虫获取京东商品评论数据 为了从京东平台抓取商品的用户评价,需先准备好相应的开发环境[^1]。这通常意味着安装必要的库文件,比如`requests`用于发起HTTP请求,`BeautifulSoup`或`lxml`用于解析HTML文档,还有可能需要`pandas`处理和保存数据。 在实际操作过程中,当访问特定的商品详情页时,可以通过浏览器开发者工具(F12)监控网络活动来识别加载评论区所使用的API接口及其传递参数[^2]。这些参数一般包括但不限于产品ID、分页索引等信息,它们帮助定位到具体的评论记录集合。 一旦确定了API端点URL模式及所需查询字符串后,就可以利用Python脚本来模拟发送GET/POST请求,并接收服务器返回的内容。由于返回的是JSON格式的数据流,因此要调用`.json()`方法将其转换成易于处理的对象结构以便后续提取有用字段,如用户名、评分星级、发表时间戳以及具体内容描述等[^4]。 下面是一个简化版的例子展示如何构建这样的爬虫: ```python import requests from pandas import DataFrame def fetch_reviews(product_id, page=0): url = f"https://api.m.jd.com/comment/skuProductPageComments?callback=fetchJSON_comment98&productId={product_id}&score=0&sortType=5&page={page}&pageSize=10" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Referer': f'https://item.jd.com/{product_id}.html' } response = requests.get(url=url, headers=headers).text.replace('fetchJSON_comment98(', '').replace(');', '') data = eval(response) reviews = [] for item in data['comments']: review = { "username": item["nickname"], "rating": item["score"], "date": item["creationTime"], "content": item["content"] } reviews.append(review) return reviews if __name__ == "__main__": product_id = input("请输入想要抓取评论的产品编号:") all_reviews = [] try: for i in range(10): # 假设只抓取前十页 new_reviews = fetch_reviews(product_id, i) if not new_reviews: break all_reviews.extend(new_reviews) df = DataFrame(all_reviews) df.to_csv(f"{product_id}_reviews.csv", index=False, encoding='utf_8_sig') print("成功导出了CSV文件.") except Exception as e: print(e) ``` 此代码片段展示了基本的工作流程:定义函数`fetch_reviews`接受商品ID和其他可选参数;设置合适的HTTP头以模仿真实用户的浏览行为;向指定地址发出请求并解析得到的结果;最后将收集来的多条评论汇总至列表再转存为CSV表格形式供进一步分析使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值