191 lines
6.2 KiB
Plaintext
191 lines
6.2 KiB
Plaintext
---
|
|
id: got-scraping
|
|
title: Got Scraping
|
|
description: Blazing fast cURL alternative for modern web scraping
|
|
---
|
|
|
|
## Intro
|
|
|
|
When using `BasicCrawler`, we have to send the requests manually. In order to do this, we can use the context-aware `sendRequest()` function:
|
|
|
|
```ts
|
|
import { BasicCrawler } from 'crawlee';
|
|
|
|
const crawler = new BasicCrawler({
|
|
async requestHandler({ sendRequest, log }) {
|
|
const res = await sendRequest();
|
|
log.info('received body', res.body);
|
|
},
|
|
});
|
|
```
|
|
|
|
It uses [`got-scraping`](https://github.com/apify/got-scraping) under the hood.
|
|
Got Scraping is a [Got](https://github.com/sindresorhus/got) extension developed to mimic browser requests, so there's a high chance we'll open the webpage without getting blocked.
|
|
|
|
## `sendRequest` API
|
|
|
|
```ts
|
|
async sendRequest(overrideOptions?: GotOptionsInit) => {
|
|
return gotScraping({
|
|
url: request.url,
|
|
method: request.method,
|
|
body: request.payload,
|
|
headers: request.headers,
|
|
proxyUrl: crawlingContext.proxyInfo?.url,
|
|
sessionToken: session,
|
|
responseType: 'text',
|
|
...overrideOptions,
|
|
retry: {
|
|
limit: 0,
|
|
...overrideOptions?.retry,
|
|
},
|
|
cookieJar: {
|
|
getCookieString: (url: string) => session!.getCookieString(url),
|
|
setCookie: (rawCookie: string, url: string) => session!.setCookie(rawCookie, url),
|
|
...overrideOptions?.cookieJar,
|
|
},
|
|
});
|
|
}
|
|
```
|
|
|
|
### `url`
|
|
|
|
By default, it's the URL of current task. However you can override this with a `string` or a `URL` instance if necessary.
|
|
|
|
*More details in [Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#url).*
|
|
|
|
### `method`
|
|
|
|
By default, it's the HTTP method of current task. Possible values are `'GET', 'POST', 'HEAD', 'PUT', 'PATCH', 'DELETE'`.
|
|
|
|
*More details in [Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#method).*
|
|
|
|
### `body`
|
|
|
|
By default, it's the HTTP payload of current task.
|
|
|
|
*More details in [Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#body).*
|
|
|
|
### `headers`
|
|
|
|
By default, it's the HTTP headers of current task. It's an object with `string` values.
|
|
|
|
*More details in [Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers).*
|
|
|
|
### `proxyUrl`
|
|
|
|
It's a string representing the proxy server in the format of `protocol://username:password@hostname:port`.
|
|
|
|
For example, an Apify proxy server looks like this: `http://auto:password@proxy.apify.com:8000`.
|
|
|
|
Basic Crawler does not have the concept of a session or proxy, therefore we need to manually pass the `proxyUrl` option:
|
|
|
|
```ts
|
|
import { BasicCrawler } from 'crawlee';
|
|
|
|
const crawler = new BasicCrawler({
|
|
async requestHandler({ sendRequest, log }) {
|
|
const res = await sendRequest({
|
|
proxyUrl: 'http://auto:password@proxy.apify.com:8000',
|
|
});
|
|
log.info('received body', res.body);
|
|
},
|
|
});
|
|
```
|
|
|
|
We use proxies to hide our real IP address.
|
|
|
|
*More details in [Got Scraping documentation](https://github.com/apify/got-scraping#proxyurl).*
|
|
|
|
### `sessionToken`
|
|
|
|
It's a non-primitive object used as a key when generating browser fingerprint. Fingerprints with the same token don't change.
|
|
This can be used to retain the `user-agent` header when using the same Apify Session.
|
|
|
|
*More details in [Got Scraping documentation](https://github.com/apify/got-scraping#sessiontoken).*
|
|
|
|
### `responseType`
|
|
|
|
This option defines how the response should be parsed.
|
|
|
|
By default, we fetch HTML websites - that is plaintext. Hence, we set `responseType` to `'text'`. However, JSON is possible as well:
|
|
|
|
```ts
|
|
import { BasicCrawler } from 'crawlee';
|
|
|
|
const crawler = new BasicCrawler({
|
|
async requestHandler({ sendRequest, log }) {
|
|
const res = await sendRequest({ responseType: 'json' });
|
|
log.info('received body', res.body);
|
|
},
|
|
});
|
|
```
|
|
|
|
*More details in [Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#responsetype).*
|
|
|
|
### `cookieJar`
|
|
|
|
`Got` uses a `cookieJar` to manage cookies. It's an object with an interface of a [`tough-cookie` package](https://github.com/salesforce/tough-cookie).
|
|
|
|
Example:
|
|
|
|
```ts
|
|
import { BasicCrawler } from 'crawlee';
|
|
import { CookieJar } from 'tough-cookie';
|
|
|
|
const cookieJar = new CookieJar();
|
|
|
|
const crawler = new BasicCrawler({
|
|
async requestHandler({ sendRequest, log }) {
|
|
const res = await sendRequest({ cookieJar });
|
|
log.info('received body', res.body);
|
|
},
|
|
});
|
|
```
|
|
|
|
*More details in*
|
|
- *[Got documentation](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#cookiejar)*
|
|
- *[Tough Cookie documentation](https://github.com/salesforce/tough-cookie#cookiejarstore-options)*
|
|
|
|
### `retry.limit`
|
|
|
|
This option specifies the maximum number of `Got` retries.
|
|
|
|
By default, `retry.limit` is set to `0`. This is because Crawlee has its own (complicated enough) retry management.
|
|
|
|
We suggest NOT changing this value for stability reasons.
|
|
|
|
### `useHeaderGenerator`
|
|
|
|
It's a boolean for whether to generate browser headers. By default, it's set to `true`, and we recommend keeping this for better results.
|
|
|
|
### `headerGeneratorOptions`
|
|
|
|
This option represents an object how to generate browser fingerprint. Example:
|
|
|
|
```ts
|
|
import { BasicCrawler } from 'crawlee';
|
|
|
|
const crawler = new BasicCrawler({
|
|
async requestHandler({ sendRequest, log }) {
|
|
const res = await sendRequest({
|
|
headerGeneratorOptions: {
|
|
devices: ['mobile', 'desktop'],
|
|
locales: ['en-US'],
|
|
operatingSystems: ['windows', 'macos', 'android', 'ios'],
|
|
browsers: ['chrome', 'edge', 'firefox', 'safari'],
|
|
},
|
|
});
|
|
log.info('received body', res.body);
|
|
},
|
|
});
|
|
```
|
|
|
|
*More details in [`HeaderGeneratorOptions` documentation](https://apify.github.io/fingerprint-suite/api/fingerprint-generator/interface/HeaderGeneratorOptions/).*
|
|
|
|
**Related links**
|
|
|
|
- [Got documentation](https://github.com/sindresorhus/got#documentation)
|
|
- [Got Scraping documentation](https://github.com/apify/got-scraping)
|
|
- [Header Generator documentation](https://apify.github.io/fingerprint-suite/docs/guides/fingerprint-generator/)
|