scrapy爬取网页数据是返回[ ],或者说爬取不到数据的排查方法

本文主要探讨Scrapy爬虫返回空值的可能原因及解决办法。原因包括IP封锁、xpath路径问题、robot协议、请求头封锁等。文中给出具体示例,如通过观察响应状态码判断是否被反爬,建议自己编写并测试xpath路径,修改robot协议设置,伪造请求头来解决问题。

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

可能的原因:
1,ip封锁爬取
2,xpath路径不对
3,xpath路径出现font,tbody标签
4,xpath路径不够明确
5,robot协议
6,请求头封锁

废话不多说,直接上图在这里插入图片描述
1,在dos窗口,输入 scrapy shell https://news.sina.com.cn/gov/xlxw/2019-07-12/doc-ihytcerm3070493.shtml 回车 (注意这里是你的网址)
在这里插入图片描述
2,观察上图1号位置,response的返回状态码是200(200~300间都可以),说明返回成功!执行2号位置的 view(response) 就可以进入你要爬取的网页了,这说明了你要爬取的网页没有在IP上对你进行反爬

http状态码200,300,404等是什么意思?可以参考以下网址
https://www.cnblogs.com/cjwxf/p/6186287.html

3,3号位置我执行 response.xpath(’/html/body/div[3]/h1/text()’).extract()
这里的xpath路径是我在网页源代码中copy来的,我要显示他的文本内容,它返回了一个空值,这告诉我copy的东西不一定是有用的,当然正常情况下是有用的,建议xpath路径自己写,不断测试,copy的xpath路径仅做内容可以爬取的检测

4,之前有碰到过在xpath路径中有font或者是tbody标签的,把它去掉改成 ***/***,之后内容可以正常显示,说明scrapy识别不了这两个标签

5,4号位置的xpath路径是自己写的,观察你要爬取网页html结构,对要爬取的元素位置,最好把它的类名或者是id名写上,以保证路径的唯一性

6,如果在dos窗口中已经可以提取出要爬取的内容了,说明xpath路径正确,但是在编写的爬虫文件中,执行spider却不能爬取到结果,而在执行爬虫程序的dos窗口中,你仔细观察,发现有robot错误,response的返回编码是503之类的异常编码,那就需要你在setting.py中,
把ROBOTSTXT_OBEY = True改为 ROBOTSTXT_OBEY = False。

7,请求头封锁:比如你执行scrapy shell https://www.qiushibaike.com/
这个网址在浏览器中可以打开,但是scrapy中不行,执行后出现下图连接错误在这里插入图片描述
这是因为scrapy的默认请求头是:
“User-Agent”:“Scrapy/1.1.2 (+http://scrapy.org)”
被网站封锁了,所以你需要伪造一个网站的请求头去进入这个网站
你执行
scrapy shell https://www.qiushibaike.com/ -s USER_AGENT=‘Mozilla/5.0’
神奇的发现,可以成功访问这个网站了,所以在编写爬虫文件时,记得伪造请求头

<think>好的,我现在要解决用户的问题,关于如何将Python爬取的京东商品数据存入Navicat管理的数据库,并通过Django实现前端图文展示。首先,我需要理清整个流程,分步骤思考。 用户提到了几个关键词:Django、Python爬虫数据存储、Navicat、数据库连接、后端、图文页面显示、京东商品数据。我需要把这些技术点串联起来。 第一步,数据爬取。用户需要爬取京东的商品数据,可能需要使用requests库或者Scrapy框架。考虑到反措施,可能需要设置请求头、使用代理或延迟。京东的页面结构可能会经常变动,所以需要检查选择器是否正确。 第二步,数据存储。用户使用Navicat管理数据库,所以可能需要先创建数据库和表结构。通常,Navicat连接的是MySQL、PostgreSQL等关系型数据库。这里假设用户使用MySQL。需要设计一个适合存储商品数据的表,包括字段如商品名称、价格、链接、图片URL等。 接下来,将爬取数据存入数据库。这里需要用到Python的数据库驱动,比如mysql-connector-python或pymysql。在爬虫脚本中,连接数据库,并将清洗后的数据插入到表中。 第三步,Django后端连接数据库。Django的ORM系统需要配置数据库连接,通常在settings.py中设置。需要确保Django的模型(Model)与数据库表结构一致,可能需要运行迁移命令。 第四步,创建Django视图和URL路由,处理前端请求。视图函数需要从数据库中读取数据,并传递给模板。可能需要分页功能,或者根据条件筛选数据。 第五步,前端图文展示。使用Django的模板语言,将数据渲染到HTML页面上。商品图片可能需要用<img>标签,链接到详情页。样式方面,可能需要使用CSS框架如Bootstrap来美化页面,确保响应式布局。 测试过程中,需要注意跨域问题、数据库连接错误、数据渲染异常等。此外,京东的数据爬取可能涉及法律问题,需要提醒用户遵守网站规则。 可能还需要考虑数据更新机制,比如定期运行爬虫脚本更新数据库。或者使用Django的admin后台管理数据,但用户提到Navicat,所以可能更倾向于直接操作数据库。 用户可能遇到的问题包括:数据库连接失败、数据插入错误、Django模型与表不匹配、前端图片无法加载等。需要逐一排查,比如检查数据库权限、字段类型是否匹配、静态文件配置是否正确。 总结步骤:爬取数据→设计数据库→存储数据→Django配置→视图和模板→前端展示。每个环节都需要详细指导,确保用户能够逐步实现。</think>### Django实现京东商品数据存储与展示的步骤说明 #### 一、数据爬取与存储 1. **京东数据爬取** 使用`requests`库发送网络请求,通过`BeautifulSoup`解析商品数据。需注意反机制(如随机延迟和伪装请求头): ```python import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/5.0'} def crawl_jd(keyword): url = f'https://search.jd.com/Search?keyword={keyword}' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'lxml') # 提取商品名称、价格、图片URL等数据 return product_list ``` 2. **数据库设计(Navicat操作)** 在Navicat中创建MySQL数据库`jd_data`,设计商品表`products`: ```sql CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(200), price DECIMAL(10,2), image_url VARCHAR(300), detail_url VARCHAR(300), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 3. **数据存储实现** 使用`pymysql`库将数据写入数据库: ```python import pymysql def save_to_mysql(product_list): conn = pymysql.connect(host='localhost', user='root', password='123456', database='jd_data') cursor = conn.cursor() for product in product_list: sql = '''INSERT INTO products (name, price, image_url, detail_url) VALUES (%s, %s, %s, %s)''' cursor.execute(sql, (product['name'], product['price'], product['image_url'], product['detail_url'])) conn.commit() cursor.close() ``` #### 二、Django后端配置 1. **项目创建与数据库连接** 修改`settings.py`配置数据库: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'jd_data', 'USER': 'root', 'PASSWORD': '123456', 'HOST': 'localhost', 'PORT': '3306', } } ``` 2. **模型定义** 创建与数据库表对应的模型(自动生成迁移文件): ```python # models.py from django.db import models class Product(models.Model): name = models.CharField(max_length=200) price = models.DecimalField(max_digits=10, decimal_places=2) image_url = models.URLField(max_length=300) detail_url = models.URLField(max_length=300) created_at = models.DateTimeField(auto_now_add=True) ``` 3. **视图与路由配置** 编写视图函数获取数据,并通过模板渲染: ```python # views.py from django.shortcuts import render from .models import Product def product_list(request): products = Product.objects.all()[:50] # 取前50条数据 return render(request, 'products.html', {'products': products}) ``` ```python # urls.py from django.urls import path from . import views urlpatterns = [ path('products/', views.product_list, name='product_list'), ] ``` #### 三、前端展示实现 1. **模板文件编写** 创建`templates/products.html`,使用Bootstrap实现响应式布局: ```html <div class="container"> <h2 class="my-4">京东商品列表</h2> <div class="row"> {% for product in products %} <div class="col-md-4 mb-4"> <div class="card"> <img src="{{ product.image_url }}" class="card-img-top"> <div class="card-body"> <h5 class="card-title">{{ product.name }}</h5> <p class="text-danger">¥{{ product.price }}</p> <a href="{{ product.detail_url }}" class="btn btn-primary">查看详情</a> </div> </div> </div> {% endfor %} </div> </div> ``` 2. **静态文件配置** 在`settings.py`中设置静态文件路径,并添加Bootstrap资源: ```python STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] ``` #### 四、关键问题解决方案 1. **图片加载失败** - 检查图片URL是否有效(如京东图片可能有防盗链) - 在`<img>`标签中添加`referrerpolicy="no-referrer"`属性 ```html <img src="{{ product.image_url }}" referrerpolicy="no-referrer"> ``` 2. **数据更新机制** - 使用`celery`定时任务定期执行爬虫脚本[^1] - 通过Django Admin手动触发爬取操作 3. **分页显示优化** ```python from django.core.paginator import Paginator def product_list(request): all_products = Product.objects.all() paginator = Paginator(all_products, 20) # 每页20条 page_number = request.GET.get('page') page_obj = paginator.get_page(page_number) return render(request, 'products.html', {'page_obj': page_obj}) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值